2014-04-17 18 views
-1

我應該創建一個方法,該方法使用有界泛型類型的ArrayList,並使用以下算法基於對象的體積對它進行排序(我必須完全按照它進行)。綁定應該只允許任何形狀的對象和子類:我的recursiveSort()方法不工作? (泛型)

if the list size is <= 1 
    return the list 
select a middle element from the list and remove it 
create two lists leftList and rightList 
for each element in the list 
    if element is less than the middle element then add element to the rightList 
    else add element to leftList 
return the combination of recursiveSort(leftList), middle element, and recursiveSort(rightList) 

我Shape類是單純只用getVolume()方法的接口在我的其他類(球形,橢圓等)覆蓋此方法

這裏是我的遞歸代碼(在另一個類,做其他方法,如發現最小值和最大值):

public class ShapeUtilities { 
public static <T extends Shape> Collection<? extends T> recursiveSort(ArrayList<T> list) { 

    if (list.size() <= 1) { 
     return list; 
    } 
    int middleIndex = list.size()/2; 
    T middleElement = list.get(middleIndex); 
    list.remove(middleIndex); 
    ArrayList<T> leftList = new ArrayList<T>(); 
    ArrayList<T> rightList = new ArrayList<T>(); 
    for (T item : list) { 
     if (item.getVolume() < middleIndex) { 
      rightList.add(item); 
     } else { 
      leftList.add(item); 
     } 
    }  

    ArrayList<? extends Shape> combination = new ArrayList<T>(); 
combination.addAll(recursiveSort(leftList)); 
    combination.add(middleElement); 
    combination.addAll(recursiveSort(rightList)); 
    return combination; 

我怎樣才能返回「recursiveSort(leftList)的組合,中間元素,並recursiveSort(rightList )「?它不會添加到我創建的ArrayList中,只是返回中間元素而不是全部三個元素。

+0

(這是快速排序) – njzk2

+0

(你錯過在你的'rightList'上調用'recursiveSort') – njzk2

+2

'list.get(i).getVolume() njzk2

回答

1

結合我的各種評論:

第一個問題是

list.size() - 1 

這會在每刪除一個元素遞歸

然後

list.get(i).getVolume() < middleIndex 

應該

list.get(i).getVolume() < middleElement.getVolume() 

你比較索引的容量。如果該卷是在一般比列表的大小的值,所有項目到leftList

最後

combination.addAll(rightList); 

不揀rightList

您之所以收到很少物品的原因是因爲循環中的略讀填充了leftList,除了一個元素,減去中間元素。

最後你只收到中間元素。

最後一點,在您的代碼中沒有理由使用舊的for循環。您可以使用快速列舉符號:

for (T item: list) { 
    if (item.getVolume() < middleItem.getVolume()) { 
     leftList.add(item); 
    } else { 
     rightList.add(item); 
    } 
} 

這確保枚舉了完整的清單,沒有索引或錯誤的風險的不確定性,如循環,直到list.size() - 1

+0

非常感謝!我已經做出了修正(並且爲想要看完整個短程序的人添加了額外的課程)。但我仍然得到錯誤,我不能將新的排序列表添加到另一個ArrayList並返回它。 – user3376836

+0

我不明白你的評論'我不能將新的排序列表添加到另一個ArrayList'。運行代碼時發生了什麼?當你調試它?你有什麼錯誤? – njzk2

+0

其實,我從來沒有再看過它(做了一些更正),它似乎以正確的順序打印出對象。十分感謝你的幫助!! :) – user3376836

1
for (int i = 0; i < list.size() - 1; i++) { 

這裏不應該有-1。你正在跳過你的最後一個元素。

combination.addAll(rightList); 

你永遠排序rightList,你只是簡單地把它當作是。

+0

雖然這仍然不能解釋爲什麼它「只返回中間元素,而不是所有三個」(這承認似乎沒有多大意義,因此我在評論中要求完整的程序)。 – Dukeling

+0

@Dukeling正確的,看起來這段代碼應該返回一個元素的唯一方式是如果初始列表只有2個元素。 –

1

是的,我想你的測試將需要:

if (list.get(i).getVolume() < middleElement.getVolume()) {