从另一个链接列表中返回包含密钥的链接列表

问题描述:

我遇到以下问题。我有一个包含名为Entry的对象的链表或位置列表。每个条目存储一个键和一个值对。我想让另一个链表从这个列表中抓取关键字。我已经想出了一种方法,但是由于某些原因,我在打印密钥列表时没有显示我添加它们的顺序。我有以下两种方法:从另一个链接列表中返回包含密钥的链接列表

public PositionalList1<K> keySet() //I prnted position by position while adding and it worked. I also tested addAfter with positionalList1 class and it worked 
{ 
    PositionInterface<Entry> iterator = map.first(); //gets first position in the Entry List 
    PositionInterface<K> first = keyList.addFirst((K)iterator.getData().getKey()); //adds to list containing just keys the key from the Entry list(getData is just a method that returns whatever object is stored at the node, in this case a Entry Object) 
    iterator = map.after(iterator); //go to next node in Entry list 

    for(int i=0;i<size-1;i++) //get rest of keys 
    { 
     PositionInterface<K> p = keyList.addAfter(first,(K)iterator.getData().getKey()); 
     iterator = map.after(iterator); 

    } 
    return keyList; 
} 

public void printKeySet(PositionalList1 list) //print key list 
{ 
    PositionInterface p = list.first(); 
    for(int i=0; i<list.size();i++) 
    { 
     System.out.println("Key : " + p.getData()); 
     p = list.after(p); 
    } 
} 

密钥集()方法返回只包含键列表中,而printKeySet取密钥集()的结果,并打印的整个关键字列表。我已经使用以下主程序测试此:

OrderedMapL<Integer,String> map2 = new OrderedMapL<Integer,String>(); 
    map2.put(2,"A");//adds (2,A) 
    map2.put(5,"B");//adds(5,B) 
    map2.put(1,"C");//adds(1,C) 
    map2.put(4,"D");//adds(4,D) 
    map2.put(3,"E");//adds(3,E) 
    map2.remove(2); //removes (2,A) 

这导致的有序列表(1,C)(2,A)..等和条目本身的顺序打印细。

PositionalList1<Integer> keyList = map2.keySet(); 
map2.printKeySet(keyList); 

出于某种原因,按键的顺序打印:调用以下时,问题出现了我1,5,4,3,而不是1,3,4,5,而且不知道为什么。任何帮助,将不胜感激。

+0

所有你使用的样子专有的,自定义类的类。我们不知道他们在做什么以及如何工作。你为什么不使用标准的Java集合? –

+0

这是用于我希望编写自己的抽象数据类型的数据结构类。与节点列表本身相关的所有辅助功能都可以工作并经过测试。 addAfter()只是在paramatized position之后添加一个位置。当我在keySet()中自己打印位置时,它们会非常奇怪,因为它们添加时打印位置正确。然而在printKeySet()中,这个顺序没有被表示出来。 – JmanxC

+0

()之后还有另一个nodelist函数,它返回paramatezied之后的位置。该函数的名称几乎告诉你它做了什么。 – JmanxC

问题是这一行:

PositionInterface<K> p = keyList.addAfter(first,(K)iterator.getData().getKey()); 

你应该first后不会增加。这就是为什么你得到错误的订单。

如果密钥1, 3, 4, 5接着会像这样将其添加:

  1. 添加1作为第一元件1
  2. 第一元件之后添加3 1 3
  3. 第一元件后添加4 1 4 3
  4. 在第一个元素后添加5 1 5 4 3

这是因为您在第一个元素之后添加它。

如果我理解正确,你的代码应该改变这样的:

// I suspect that #addFirst method returns added list element 
PositionInterface<K> last = keyList.addFirst((K) iterator.getData().getKey()); 
iterator = map.after(iterator); 

for(int i = 0; i < size - 1; i++) 
{ 
    // I suspect that #addAfter method returns added list element 
    PositionInterface<K> last = keyList.addAfter(last, (K) iterator.getData().getKey()); 
    iterator = map.after(iterator); 

} 
+0

错误的很好的解释...但解决方案是? – joc

+0

哇谢谢你愚蠢的错误! – JmanxC