2011-05-06 150 views
1

我正在嘗試一些非常基本的java,並且已經達到了一點頭部劃痕。實質上,我需要從文件中讀取某些元素,將其轉換爲某種類型的數組或列表,對它們進行排序,消除重複項,然後返回前三個元素。 TreeSet看起來非常適合它,並且殺死了重複項。我的問題是,我對如何僅返回前三個要素感到困惑。迭代器似乎貫穿整個集合。用手動迭代器創建一個while循環來包含一個持有迭代器循環的while循環似乎令人困惑,並且不太可能成功。這裏的答案是我需要遍歷treeset並將每個元素放入一個數組列表中,以便我可以訪問前三個元素?我的意思是,這似乎有效,但看起來非常複雜。提示?訪問treeset中的元素

回答

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(); 
} 
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()); 
如果你喜歡 「脫糖」 版本

3

使用Guava你可能只是做字符串

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

我會用(希望您使用Java 1.6):

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

編輯:要防彈,尺碼我加Math.min()

+2

使用'toArray()'會在你只需要前3個時複製整個內容。它看起來比人工循環更好,但是很浪費。 – ColinD 2011-05-06 20:02:14

+1

重複檢查並且必須同意你的意見。 – 2011-05-06 20:07:47

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

我覺得這很容易。有用的是,方法toArray(T[] a)採用通用數組參數,它可以幫助您指定幾乎所有與TreeSet<>中的數據匹配的數組類型。