2013-05-03 91 views
6

我正在循環查找某個特定條目,然後將其分配給一個變量並嘗試稍後將其刪除。演示比解釋更容易。如何從對象列表中提取K個「最小」元素?

ArrayList<Example> list1 = populate(); 

Example ex1 = list1.get(0); 
Example ex2 = ex1; 
list1.remove(ex2); 

我知道這可能有事情做與Java的無法處理的指針,而是一個可行的解決方案將是巨大的。

編輯:爲了詳細說明,這是我的代碼的一個簡單示例,而不是給你完整的東西。我正在做的是遍歷列表來找到最低的10個數字。我的技術是查看列表,找到最低值並將其添加到另一個列表中,然後從原始列表中刪除該數字並重復。但是我的列表是由內部具有int值的對象組成的,而不是整數列表。

for(0 to 9){ 
    for(0 to list.size){ 
     if(list.get(x) < smallest) 
      smallest = list.get(x) 
    } 
    smallestList.add(smallest); 
    list.remove(smallest) 
} 
+0

你能否詳細說明一下,你想達到什麼目的? – sanbhat 2013-05-03 11:45:42

+2

這裏有點不清楚你的意思。從列表中刪除元素很好,將它們分配給變量也很好,但由於ex2和ex1在這裏相同,所以您將刪除ex1。那是你要的嗎? – 2013-05-03 11:46:10

+0

這對我來說很好。問題是什麼? – 2013-05-03 11:46:26

回答

2

我會對列表進行排序。然後,我會用這10個最小的對象創建一個列表,並將原始列表list1更改爲包含剩餘的對象。喜歡的東西:

Collection.sort(list1); 
ArrayList<Example> yourSmallestElements = (ArrayList<Example>)(list1.sublist(0, 9).clone()); 
list1.removeAll(yourSmallestElements); 

注:我克隆子表,因爲sublist()只返回列表list1視圖,這不是你想要的這裏。

您的課Example可以實現「可比較」,以便您可以定義他們需要如何比較。您將需要實施方法compareTo()。事情是這樣的:

public class Example implements Comparable<Example> { 
    private int integerVal = <a value>; 

    public int compareTo(Example exampleObject) { 
     return exampleObject.integerVal - this.integerVal; 
    } 
} 

看一看this link,更確切地說如下開頭的類:

public class Fruit implements Comparable<Fruit>{ 
+0

這是一個很好的解決方案...但問題陳述 - 「然後從原始列表中刪除該數字」。你的方法修改了原始列表,不會刪除元素。 – Bill 2013-05-03 12:09:17

+0

這是一個觀點。但是,他只能保留排序列表中最大的元素...... – JonesV 2013-05-03 12:13:00

+1

@Bill但問題是(是?)錯誤地問。真正的問題是:哪個是在列表中找到最小K數的最佳方法?然後,@ – 2013-05-03 12:13:40

1

如果你想你的對象進行排序...

Example e; 
int min=-1; // assuming the list has +ve numbers only 
for (Example elem : yourList) 
{ 
if (elem.gtVaribale() <= min) //assuming you have variable field in your object 
{ 
    e = elem; 
    min = elem.getVariable(); 
} 
} 
yourList.remove(e); 

//repeat this for remaining elements of the list 

//you can create another sorted list, and do sortedList.add(e), so that sortedList 
//have objects in ascending order (of the variable you want to sort) of objects you had in yourList 

這只是一個僞代碼,我沒有編譯它。

0

這裏您將不得不重寫類Example的可比較方法。 您必須讓編譯器知道它應該將您的e變量與其列表元素進行比較以便將其刪除。