1

I currently have following code:

 int[][] legalForBlack = {{0,1},{1,0},{2,3},{3,2}};
 for (int x=0;x<boardSize;x++) {
 for (int y=0;y<boardSize;y++) {
 if (x,y) in legalForBlack
 methodA()
 else
 methodB()
 }
 }

Of course this code won't compile. I am looking for a fancy and compact way to check when (x,y) are in the given list. I can do this with 4 if-statements or a loop, but this is not a proper way imo. I am looking for something that does this in constant time.

EDIT:

I think I found a way. What do you think of this?

int[][] legalForBlack = {{0,1},{1,0},{2,3},{3,2}}; // keep in order!
 int cur = 0;
 for (int x=0;x<boardSize;x++) {
 for (int y=0;y<boardSize;y++) {
 int[] buffer = legalForBlack[cur];
 if (x==buffer[0] && y==buffer[1]) {
 cur++;
 methodA();
 } else {
 methodB();
 }
 }
 }
asked Apr 29, 2016 at 12:40

3 Answers 3

2
boolean isLegal = false;
for(int[] coord: legalForBlack)
 if(Arrays.equals(coord, someXYArray)) {
 isLegal = true;
 break; //Credit to Adnan Isajbegovic
 }
if(isLegal) 
 methodA();
else 
 methodB();
answered Apr 29, 2016 at 12:50
1
  • 1
    just add break; in if(Arrays.equals(coord, someXYArray)) so it doesnt continue when you have a match. Commented Apr 29, 2016 at 12:53
2

I have an alternative solution for your question. Judging from your code, I assume that you are writing something chess-related and your list of legalForBlack is a series of coordinates that the player is allowed to move to. Best way IMO would be to code each square on the board with an index (0 to maximum 63) and store all of these in a Map of type <Integer, Coordinate>, where Coordinate has int x and int y. If you don't have any particular use for the coordinates, you can also skip and convert your Map to a simple Array of allowed-squares. This would only require you to check whether a given value is in your allowed-square list. I hope this gives you a better approach to your problem. Good luck!

answered Apr 29, 2016 at 13:05
2

Heres pseudocode for arrays:

input data in array
find x with for to match first column (legalForBlack[i][0])
 if x matches legalForBlack[i][0] check if legalForBlack[i][1] matches y
 if yes, count it

But there is a better way, when you just want to check if they are in array. Create object Pair with variable x and y, create equals() and hashCode() functions to have unique for each pair (like get hashCode from string xy), place all inputs in Set and then check if given Pair(x,y) is in Set.

answered Apr 29, 2016 at 12:43
7
  • Indeed. But this will require a loop within Set.contains(...) itself. I was thinking of something in constant time. I added a new piece of code which requires constant time. Commented Apr 29, 2016 at 12:49
  • 1
    Set contains works in O(1), so there are no loops. Only loop is for insert, but you already do it when placing data in array if you didn't hardcoded it. Commented Apr 29, 2016 at 12:51
  • Ah I must have overlooked the complexity. U are right. Commented Apr 29, 2016 at 12:54
  • But you must use HashSet for it. Commented Apr 29, 2016 at 12:54
  • What do you think of the piece I wrote (I added it in the main post). Commented Apr 29, 2016 at 12:56

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.