2015-03-25 105 views
1

编辑:在你的帮助下,我设法解决了我的问题。我编辑了我的代码,现在演示如何设置它以使其工作。试图比较两个迭代器的内容,怎么样?

目前我无法编码比较两个迭代器内容的部分。作为我的任务的一部分,我需要使用链表来存储输入字符串的单个字符。我已经到了我有两个包含输入单向和反向输入的迭代器的地步。

 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 2015-03-25 00:39:04

+0

这不是真的这里的问题。 OP迭代通过两个迭代器输出值,之后两个迭代器都是“空的”,因此将被识别为“相等”。您应该创建新的迭代器进行比较。 – 2015-03-25 00:48:28

+0

好的,我用那条线代替了那条线,但它仍然返回,我所有的错误输入都是真的。还有什么你可以认为我可能需要修复的?该打印现在也输出文本的随机乱码。 另外我希望他们有相同的顺序相同的元素。抱歉含糊不清。 – user286152 2015-03-25 00:51:52

回答

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

System.out.println(same); 
+0

这似乎总是返回true。当我在输入中输入“fish”时,我可以看到迭代器具有f i s h并且desIterator具有h s i f但它仍然表示它们是真的。我相信这是因为你的解决方案只是检查内容而不是订单,我应该更具体。如果我需要考虑订单,我该如何做到这一点?所以r a c e c a r r和r a c e c a r r显示正确,但不是f i s h和h s i f? – user286152 2015-03-25 00:35:09

+1

我发布的解决方案会检查内容和订单。您可能没有正确设置您的列表。但是您没有发布该代码,所以我再也无法提供帮助。 – satnam 2015-03-25 00:37:03

+0

请注意,这假定这两个迭代器具有相同数量的元素(在问题中给出)。不过,你应该可以用'equals'来比较。 – 2015-03-25 00:38:15

2

您需要同时迭代两个迭代器,即使用一个循环。下面是一般的比较功能(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; 
} 

番石榴实施此为Iterators.elementsEqual