2014-10-07 1 views
1

Я использую ArrayList из ArrayLists для структуры данных, чтобы играть в игры с башнями ханой. Игра построена и инициализируется следующим образом:Как получить фактическое целочисленное значение из списка массивов

private ArrayList<ArrayList> lists = new ArrayList<ArrayList>(); 
private ArrayList<Integer> peg1 = new ArrayList<Integer>(); 
private ArrayList<Integer> peg2 = new ArrayList<Integer>(); 
private ArrayList<Integer> peg3 = new ArrayList<Integer>(); 


//Constructor 
public TowersOfHanoi() { 

    lists.add(null); 
    lists.add(peg1); 
    lists.add(peg2); 
    lists.add(peg3); 
} 

public ArrayList initializeGame(int n) { 

    for (int i = 0; i < n; i++) { 
     peg1.add(i+1); 
    } 

     return peg1; 
    } 
} 

Я пытаюсь использовать булеву метод, чтобы сделать проверку и убедиться, что пользователь не пытается переместить больший диск на верхней части меньшего диска, однако , Я не понимаю, как бы захватить целочисленное значение, хранящееся в массиве. Целочисленные значения должны служить способом измерения диаметра дисков. И.Е. 1 меньше двух меньше 3 и т. Д. Это код, который я придумал ... Я считаю, что просто получаю индексы, а не фактические значения целых чисел, хранящихся там. Как я могу получить фактические значения?

public boolean isMoveLegal(int moveFrom, int moveTo){ 

    ArrayList<Integer> fromPeg = lists.get(moveFrom); 
    int x = (fromPeg.remove(0)).intValue(); 

    ArrayList<Integer> toPeg = lists.get(moveTo); 
    int y = (toPeg.get(0)).compareTo(x); 

    if(x<y){ 

    System.out.println("illegal move"); 
    } 

    return false; 
} 
+0

Вы даже смотреть на Javadocs первым? –

+0

Знаете ли вы, что ваш метод 'isMoveLegal()' всегда возвращает * false *? –

+0

'remove' и' get' оба возвращают значения из списка, а не индексы. Как говорится в ответе, вы не устанавливаете 'y' значение из списка, потому что' compareTo' испортит его. Также: (1) Если у вас есть Integer, вы можете назначить его 'int', не используя' intValue() '. (Это называется auto-unboxing.) (2) Вместо 'ArrayList ', используйте 'ArrayList >'. Вы не должны использовать общие типы (такие как 'ArrayList') без параметра типа (' Integer'), если это абсолютно необходимо. – ajb

ответ

1

Проблема с кодом, что isMoveLegal не имеет путь, в который он будет n true: возвращается только возвращаемый оператор false. Вы должны изменить оператор возврата следующим образом:

return x >= y; 

Эта линия тоже неправильно:

int y = (toPeg.get(0)).compareTo(x); 

, а не получать фактическое значение в y, вы сохраняете результат сравнения y к x, который не что-то, что вы должны сравнить с x еще раз.

Кроме того, ваш чек является инвазивным: он удаляет диски в верхней части ваших колышек (из вашего кода видно, что верхняя часть башни соответствует нулевому положению, это неортодоксально, но вы, безусловно, можете заставить ее работать).

Вместо того, чтобы использовать remove(0), вы должны использовать get(0) после проверки того, что содержимое колышки не пуст.

Если пучок «от» пуст, движение недействительно. Если привязка «до» пуста, это действие действительно. В противном случае применяются обычные правила сопоставления (т. Е. Больший диск не может находиться поверх меньшего диска).

public boolean isMoveLegal(int moveFrom, int moveTo){ 
    ArrayList<Integer> toPeg = lists.get(moveTo); 
    if (toPeg.isEmpty()) return true; // You can move anything on an empty peg 
    int y = toPeg.get(0).intValue(); 
    ArrayList<Integer> fromPeg = lists.get(moveFrom); 
    if (fromPeg.isEmpty()) return false; // No disks on the "from" peg 
    int x = fromPeg.get(0).intValue(); 
    if(x>y){ 
     System.out.println("illegal move"); 
     return false; 
    } 
    return true; 
} 
+0

Я понимаю, что вы говорите. изменил 'fromPeg.remove (0)' на 'fromPeg.get (0)' и изменил оператор return, но он все еще позволяет мне помещать больший диск на меньший. –

+0

Я идиот. Это работает. Спасибо. –

1

Это

int y = (toPeg.get(0)).compareTo(x); 

должно быть что-то вроде

int y = (toPeg.size() > 0) ? toPeg.get(0).intValue() : -1; 

Затем вы можете использовать

if (x > y) { // <-- the reverse of like you were, because the to peg is y. 
+0

'int y = (toPeg.size()> 0)? toPeg.get (0) .intValue(): -1; 'действительно собирается бросить это noob –

+0

Кроме того, OP не должен вызывать remove(), если диск фактически не перемещен. – Jason

+0

Спасибо за ваше предложение. Это похоже на симпатичную небольшую синтаксическую магию, но, к сожалению, она все еще не работает. Я также попытался использовать 'fromPeg.remove (0) .intValue()' сохранение этого в 'x' и использование' toPeg.get (0) .intValue() 'сохранение этого в' y'. Это тоже не сработало. Правильно ли я предполагаю, что я просто храню целочисленное значение индекса, а не фактическое целое число, хранящееся в индексе? Я думаю, что это моя проблема. –

1
public boolean isMoveLegal(int moveFrom, int moveTo){ 

    ArrayList<Integer> fromPeg = lists.get(moveFrom); 
    if(fromPeg != null && fromPeg.size() > 0) { 

     int x = fromPeg.get(0).intValue(); 

     ArrayList<Integer> toPeg = lists.get(moveTo); 
     if(toPeg != null) { 

      if(toPeg.size() == 0) { 
       return true; 
      } else { 

       int y = toPeg.get(0).intValue(); 

       if(x<y){ 
        return true; 
       } 
      } 
     } 
    } 

    System.out.println("illegal move"); 

    return false; 
} 
+0

Считайте, что это также работает. Я считаю, что 'toPeg.size() == 0' может быть заменен на' toPeg.isEmpty() ' –

 Смежные вопросы

  • Нет связанных вопросов^_^