从另一个链接列表中返回包含密钥的链接列表
问题描述:
我遇到以下问题。我有一个包含名为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,而且不知道为什么。任何帮助,将不胜感激。
答
问题是这一行:
PositionInterface<K> p = keyList.addAfter(first,(K)iterator.getData().getKey());
你应该first
后不会增加。这就是为什么你得到错误的订单。
如果密钥1, 3, 4, 5
接着会像这样将其添加:
- 添加1作为第一元件
1
- 第一元件之后添加3
1 3
- 第一元件后添加4
1 4 3
- 在第一个元素后添加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);
}
所有你使用的样子专有的,自定义类的类。我们不知道他们在做什么以及如何工作。你为什么不使用标准的Java集合? –
这是用于我希望编写自己的抽象数据类型的数据结构类。与节点列表本身相关的所有辅助功能都可以工作并经过测试。 addAfter()只是在paramatized position之后添加一个位置。当我在keySet()中自己打印位置时,它们会非常奇怪,因为它们添加时打印位置正确。然而在printKeySet()中,这个顺序没有被表示出来。 – JmanxC
()之后还有另一个nodelist函数,它返回paramatezied之后的位置。该函数的名称几乎告诉你它做了什么。 – JmanxC