我有一个类isPalindrome
,在那里我接收一个字符串,将其转换为Deque,然后发现Deque的顺序是从前到后还是从后到前相同。我已经学会了使用迭代器来帮助自己完成这项任务,但当我尝试运行代码时,似乎出现了问题。
这是我到目前为止的代码:
public boolean isPalindrome(String word) {
Deque<Character> L = new LinkedListDeque<>();
for (int x = 0; x < word.length()-1; x++) {
L.add(word.charAt(x));
}
if (L.descendingIterator() == L.iterator()) {
return true;
} else {return false;}
谁能解释一下我在这件事上哪里出错了吗。我试着调试这个代码已经很久了。任何对我的代码的编辑和解释都将不胜感激:(
附言:我的LinkedListDeque
几乎就是这个
public class LinkedListDeque<T> extends LinkedList<T> implements Deque<T> {
}
迭代器本身无法进行比较。您必须对其进行迭代,以获得基础集合的值(这就是名称的来源(。
final Iterator<Character> asc = L.iterator();
final Iterator<Character> desc = L.descendingIterator();
// both iterators have the same underlying collection, so `hasNext` _must_ return the same value for both
while(asc.hasNext() && desc.hasNext()) {
if (!Objects.equals(asc.next(), desc.next()) {
// characters are different, definitely not a palindrome
return false;
}
}
// both iterators fully consumed without finding an offending character => a palindrome was found
return true;
CCD_ 3检查是否还有更多的元素尚未被访问。Iterator#next
将迭代器向前移动一,即它消耗元素并返回它
关于您的代码的更多观察:
==
比较内存地址,而不是对象的值Iterator
实例不实现equals
,因此它们无法进行比较- 不需要创建新的
LinkedListDeque
,因为LinkedList
已经实现了Deque
ArrayDeque
是另一种Deque类型,其不遭受与LinkedList
相同的存储器开销- 该算法对deque进行了两次完全迭代,前后两次;这是低效的(工作量的两倍(。当两个迭代器在中间相遇时停止就足够了(但迭代器接口不提供这样的功能。也许使用
ListIterator
可以帮助避免这种情况(。对于简单和简短的输入,这不会是一个问题