2015-02-01 4 views
1

Этот метод всегда возвращает false, даже когда вводятся правильные цифры. Если числа 1-n^2 и никакие дубликаты не введены, это должно возвращать true.Проверка значений Метод не работает для проверки на Magic Square

public boolean checkValues() 
{ 
    int numCounter=1; 
    boolean okay=false; 
    while (numCounter<=n*n) 
    { 
    for (int i=0; i< n ; i++) 
    { 
     for (int j=0; j< n ; j++) 
     { 
      if ((int) square.get(i).get(j)==numCounter) 
       okay=true; 
     } 
    } 
    okay=false; 
    numCounter++; 
    } 
    if (numCounter==n*n) 
    return true; 
    else 
    return false; 
} 
+0

Пожалуйста, объясните немного больше значений, ожидаемых этим методом. Вы не должны ожидать, что все знают «магический квадрат». Трудно узнать, что вы пытаетесь реализовать специально, когда код работает некорректно. – Razib

+0

Извините! То, что я делаю, вводит числа в arraylist arraylist и проверяет, имеются ли числа 1-n^2 (n^2 размер более крупного arraylist) и что дубликатов нет. Существует больше магического квадрата, но у меня есть эти методы работы. – newAtJava

ответ

1

Изменение if (numCounter==n*n) к if (numCounter==n*n+1) поскольку ваше время петля, наконец, будет делать numCounter++; снова, или замените while (numCounter<=n*n) с while(numCounter<n*n) если n*n на самом деле не требуется, чтобы проверить

Обновлено:

Я заметил, что вы в действительности не используете okay, я думаю, вам может потребоваться изменить:

public boolean checkValues() 
{ 
    int numCounter=1; 
    boolean okay=false; 
    while (numCounter<=n*n) 
    { 
    ok = false; 
    for (int i=0; i< n ; i++) 
    { 
     for (int j=0; j< n ; j++) 
     { 
      if ((int) square.get(i).get(j)==numCounter) 
       ok=true; 
     } 
    } 
    if(!ok) // numCounter cannot be found 
     return false; 
    numCounter++; 
    } 
    return true; // successfully passed the check through 1 to n^2 
} 

Однако я считаю, что лучшее решение с точки зрения временной сложности состоит в следующем: вы можете использовать HashSet для проверки дубликатов.

public boolean checkValues() 
{ 
    Set<Integer> total = new HashSet<Integer>(); 
    for (int i=0; i< n ; i++){ 
     for (int j=0; j< n ; j++){ 
      int num = square.get(i).get(j); 
      if(num>=1 && num<=n*n) 
       total.add(num); 
     } 
    } 
    if(total.size() == n*n) 
     return true; 
    else 
     return false; 
} 
+0

Да, да спасибо! – newAtJava

+0

Единственная проблема заключается в том, что добавление okay обратно в него застряло в бесконечном цикле – newAtJava

+0

@newAtJava Я просто добавил numCounter ++ в конце while-loop, что требуется –