目前我在编写比较两个迭代器内容的部件时遇到问题。作为我的作业要求的一部分,我需要使用链表来存储输入的字符串的各个字符。我已经达到了这样的程度,即我有两个迭代器,它们包含输入的单向和反向。
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 :(得分:4)
boolean same = true;
while(iterator.hasNext()){
if(!desIterator.hasNext() || !iterator.next().equals(desIterator.next())){
same = false;
break;
}
}
System.out.println(same);
答案 1 :(得分:3)
您需要同时迭代两个迭代器,即使用一个循环。这是一般比较函数(当相等时为0,当A B时为> 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。
答案 2 :(得分:1)
在两个答案中,如果iterator.next()== null,则抛出NullPointerException。这种方法比较合适。
public static boolean equals(Iterator i1, Iterator i2) {
if (i1 == i2) {
return true;
}
while (i1.hasNext()) {
if (!i2.hasNext()) {
return false;
}
if (!Objects.equals(i1.next(), i2.next())) {
return false;
}
}
if (i2.hasNext()) {
return false;
}
return true;
}