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