访问树集中的元素

时间:2011-05-06 19:42:47

标签: java treeset

我在这里尝试了一些非常基本的java,并且已经达到了一点点。本质上,我需要从文件中读取一些元素到某种类型的数组或列表,对它们进行排序,消除重复,然后返回前三个元素。 TreeSet似乎是完美的契合,就像排序和杀死重复一样。我的问题是,我对如何只返回前三个元素感到困惑。迭代器似乎一直在整个集合中运行。使用手动迭代器创建一个while循环以包含一个包含迭代器循环的while循环,这似乎令人困惑,并且不太可能成功。这里的答案是我需要遍历树集并将每个元素放入一个arraylist中,以便我可以访问前三个元素吗?我的意思是,似乎这会起作用,但似乎非常复杂。提示?

5 个答案:

答案 0 :(得分:3)

使用Guava你可以做到

return Lists.newArrayList(Iterables.limit(treeSet, 3));

答案 1 :(得分:2)

嗯。显而易见的是什么问题?

ArrayList<MyType> buffer = new ArrayList<MyType>(3); 

for( MyType elt: myTreeSet ) {

    buffer.add(elt);
    if( buffer.size() == 3 ) break;
}

或者

ArrayList<MyType> buffer = new ArrayList<MyType>(3);
Iterator<MyType> iter = myTreeSet.iterator();

while( iter.hasNext() && buffer.size() < 3 ) buffer.add(iter.next());

如果您更喜欢“desugared”版本?

答案 2 :(得分:1)

字符串示例:

TreeSet<String> treeSet = new TreeSet<String>(); 

// you populate treeSet with data

String[] stringArray = new String[NUMBER_OF_NEEDED_RECORDS];
for(int i =0; i < NUMBER_OF_NEEDED_RECORDS; i++) {
    stringArray[i] = treeSet.pollFirst();
}

答案 3 :(得分:1)

我会使用(期望你使用Java 1.6):

Arrays.copyOf(myTreeSet.toArray(), Math.min(3, myTreeset.size()));

修改:使用我添加的Math.min()

尺寸进行防弹

答案 4 :(得分:0)

TreeSet<String> tree = new TreeSet<String>();
// fill the tree set
String[] stringArray = new String[tree.size()];
tree.toArray(stringArray);

我觉得这简直容易。有用的是方法toArray(T[] a)采用通用数组参数,它可以帮助您指定几乎所有与TreeSet<>中的数据匹配的数组类型。