2015-03-25 2 views
1

EDIT: С вашей помощью мне удалось исправить мою проблему. Я редактировал мой код, чтобы показать, как я должен был настроить его, чтобы он работал.Попытка сравнить содержимое двух Итераторов, как?

В настоящее время у меня возникает проблема с кодировкой части, которая сравнивает содержимое двух итераторов. В рамках требований для моего задания мне нужно использовать связанный список для хранения отдельных символов введенной строки. Я дошел до того, что у меня есть два итератора, которые будут содержать входной путь в обратном направлении.

 String palindrom = input.getText(); 
     String [] chara = palindrom.split (""); //this is successfully splitting them, tested. 


     int length = palindrom.length(); // length == 8 
     System.out.println (length); //can use this for how many checks to do? 
     LinkedList ll = new LinkedList(Arrays.asList(chara)); 


     Iterator iterator = ll.iterator(); 
     Iterator desIterator = ll.descendingIterator(); 

     /*while(iterator.hasNext()){ 
      System.out.println(iterator.next()); 
     } 

     while(desIterator.hasNext()){ 
      System.out.println(desIterator.next()); 
     }*/ 
     boolean same = true; 
     while(iterator.hasNext()){ 
      if(!iterator.next().equals(desIterator.next())){ 
      same = false; 
      break; 
      } 
     } 

И с помощью System.out я могу видеть, что они хранятся правильно, но я не знаю, как проверить, если итераторы хранить то же содержание. Что было бы одним из простейших методов для сравнения двух итераторов или преобразования их в нечто, что я могу сравнить? Чтобы уточнить, я хочу проверить, что они содержат одни и те же элементы в том же порядке.

+0

Чтобы уточнить, вы хотите подтвердить, что оба итератора имеют одни и те же элементы или оба итератора имеют одинаковые элементы в том же порядке. – kag0

+0

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

+0

Итак, я заменил эту строку строкой, которую я имел, но все еще возвращаю, что все мои неправильные входы истинны. Что-нибудь еще, что вы думаете, мне может понадобиться исправить? Теперь печать также выводит случайные штрихи текста. Также я хочу, чтобы они имели одинаковые элементы в одном порядке. Извините за туманность. – user286152

ответ

3
boolean same = true; 
while(iterator.hasNext()){ 
    if(!iterator.next().equals(desIterator.next())){ 
    same = false; 
    break; 
    } 
} 

System.out.println(same); 
+0

Кажется, это всегда возвращается к истине. Когда я ввожу «рыбу» во вход, я вижу, что итератор имеет f i s h, а desIterator имеет h s i f, но он все еще говорит, что они верны. Я считаю, что это потому, что ваше решение просто проверяет содержимое, а не заказ, я должен был быть более конкретным. Как мне это сделать, если мне нужно будет принять во внимание заказ? поэтому r a c e c a r и r a c e c a r показывает true, но не f i s h и h s i f? – user286152

+1

Решение, которое я разместил, проверяет содержимое и порядок. Вероятно, вы неправильно настроили свой список. Но вы не опубликовали этот код, поэтому я больше не могу помочь. – satnam

+0

Обратите внимание, что это предполагает, что оба итератора имеют одинаковое количество элементов (задано в вопросе). Однако вы, вероятно, должны сравнить с «equals». –

2

Вам необходимо выполнить итерацию обоих итераторов одновременно, то есть одним контуром. Вот общая функция сравнения (0 при равных условиях, < 0, когда А < В,> 0, когда А> В):

static <T extends Comparable<S>, S> int compare(Iterator<T> a, Iterator<S> b) { 
    while (a.hasNext() && b.hasNext()) { 
     int comparison = a.next().compareTo(b.next()); 
     if (comparison != 0) { 
      return comparison; 
     } 
    } 
    if (a.hasNext()) 
     return 1; 
    if (b.hasNext()) 
     return -1; 
    return 0; 
} 

Для того, чтобы просто проверить, если они равны, то это может быть упрощено:

static <T, S> boolean equals(Iterator<T> a, Iterator<S> b) { 
    while (a.hasNext() && b.hasNext()) { 
     if (!a.next().equals(b.next())) { 
      return false; 
     } 
    } 
    if (a.hasNext() || b.hasNext()) { 
     // one of the iterators has more elements than the other 
     return false; 
    } 
    return true; 
} 

Guava реализует это как Iterators.elementsEqual.

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