2014-09-02 73 views
1

問題提取第一k個元素有效

我寫的,我有一個TreeSet包含可比元素一個簡單的Java程序(這是我寫我自己的類)。在一個特定的時刻,我需要從只有第一個k元素。

我所做的

目前,我發現我的問題,有兩種不同的解決方案:

  1. 使用我寫一個簡單的方法;它複製了最初的TreeSet中的第一個元素;
  2. 使用Google GuavagreatestOf方法。

對於需要調用該方法以這種方式第二個選項: Ordering.natural().greatestOf(mySet, 80))

但我認爲這是無用的,因爲元素已經排序使用這種調用。我錯了嗎?

問題

我想在這裏問哪個是正確的,並在同一時間,有效的方法來獲得Collection派生類中包含一個TreeSet的第一ķ元素?

信息

Java版本:> = 7

+0

你希望新集合如果原來'Set'的變化而變化?如果是這樣,你可以將'Set'包裝在另一個對象中 - 這是一個非常有效的機制。 – OldCurmudgeon 2014-09-02 15:20:13

+0

生成的Set不會被修改。 – 2014-09-02 15:21:06

+0

我不想關閉,但至少在其算法部分,它看起來像是[this thread](http://stackoverflow.com/q/10751953/572670)的部分代碼。 – amit 2014-09-02 15:21:07

回答

1

我會建議你使用TreeSet<YourComparableClass>集合,它似乎是你正在尋找的解決方案。

TreeSet可以爲您返回一個迭代器,您可以通過存儲迭代器返回的對象來簡單地迭代K次:元素將按順序返回給您。另外一個TreeSet保持你的元素總是被排序:在任何時候,當你添加或移除元素時,它們被插入和移除以便結構保持有序。

這裏一個可能的例子:

public static ArrayList<YourComparableClass> getFirstK(TreeSet<YourComparableClass> set, int k) { 
    Iterator<YourComparableClass> iterator = set.iterator(); 
    ArrayList<YourComparableClass> result = new ArrayList<>(k); //to store first K items 
    for (int i=0;i<k;i++) result.add(iterator.next()); //iterator returns items in order 
    //you should also check iterator.hasNext(); if you are not sure to have always a K<set.size() 
    return result; 
} 
+0

這個答案可能與我的第一個解決方案有關。這樣對嗎? – 2014-09-02 15:22:55

+0

@AlessandroSuglia是的,現在你已經編輯你的問題更加清楚,你已經想到了這種解決方案 – WoDoSc 2014-09-02 15:31:35

+0

謝謝你的建議。但我認爲,這是沒用的,再寫一個方法,如果有什麼真正的好可用的:)其實 – 2014-09-02 15:32:51

0

descendingIterator() method of java.util.TreeSet產生從最大到最小的元素,所以你可以加強它然而很多次,將元素插入集合。運行時間是O(log n + k),其中k是返回的元素的數量,這肯定足夠快。

如果您使用的是HashSet,而另一方面,則實際上元素排序,所以你需要使用您指定的線性時間的選擇方法。