Пытаетесь сравнить содержимое двух итераторов, как?

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
    Чтобы уточнить, хотите ли вы подтвердить, что оба итератора имеют одни и те же элементы или что оба итератора имеют одинаковые элементы в одинаковом порядке.
  • 0
    Это на самом деле не проблема здесь. OP выполняет итерацию по обоим итераторам для вывода значений, после чего оба итератора являются «пустыми» и, следовательно, будут распознаваться как «равные». Вы должны создать новые итераторы для сравнения.
Показать ещё 5 комментариев
Теги:
iterator
input
compare
listiterator

2 ответа

2
Лучший ответ
boolean same = true;
while(iterator.hasNext()){
  if(!desIterator.hasNext() || !iterator.next().equals(desIterator.next())){
    same = false;
    break;
  }
}

System.out.println(same);
  • 0
    Кажется, это всегда возвращает истину. Когда я набираю «fish» на входе, я вижу, что итератор имеет fish, а desIterator имеет hsif, но он все равно говорит, что они верны. Я считаю, что это потому, что ваше решение просто проверяет содержимое, а не порядок, я должен был быть более конкретным. Как бы я это сделал, если бы мне нужно было принять во внимание заказ? так гоночный автомобиль и гоночный автомобиль показывают правду, а не рыбу и ссиф?
  • 1
    Решение, которое я разместил, проверяет как содержание, так и порядок. Вы, вероятно, неправильно настроили свой список. Но вы не опубликовали этот код, поэтому я больше не могу помочь.
Показать ещё 7 комментариев
3

Вам нужно перебирать оба итератора одновременно, т.е. С одним циклом. Вот общая функция сравнения (0 при равном, <0, когда A <B,> 0 при A> B):

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню