簡體   English   中英

不確定如何根據ArrayList中的對象部分對ArrayList進行排序(Java)

[英]Not sure how to sort an ArrayList based on parts of Objects in that ArrayList (Java)

我有一個Sorts類,該類對通過它的任何類型的ArrayList進行排序(基於插入排序,這是分配的方向),並使用插入排序按字典順序對列表中的項目進行排序:

public class Sorts
{
public static void sort(ArrayList objects)
{
    for (int i=1; i<objects.size(); i++)
    {
        Comparable key = (Comparable)objects.get(i);
        int position = i;

        while (position>0 && (((Comparable)objects.get(position)).compareTo(objects.get(position-1)) < 0))
        {
            objects.set(position, objects.get(position-1));
            position--;
        }   
        objects.set(position, key);
    }
}
}

在其他文件之一中,我使用了一種對Owner類型的對象進行排序的方法(稍后在main中調用),並且我們必須按姓氏對它們進行排序(如果它們相同,則為名字):

說明:“將所有者列表按姓氏從A到Z排序。如果多個所有者具有相同的姓氏,請比較其姓氏。此方法調用Sorts類中定義的sort方法。”

我首先想到的是在for循環中獲取每個所有者的姓氏,將其添加到字符串類型的臨時ArrayList中,調用Sorts.sort(),然后將其重新添加回ArrayList ownerList中:

public void sortOwners() {
    ArrayList<String> temp = new ArrayList<String>();
    for (int i=0; i<ownerList.size(); i++)
        temp.add(((Owner)ownerList.get(i)).getLastName());
    Sorts.sort(temp);
    for (int i=0; i<temp.size(); i++)
        ownerList.get(i).setLastName(temp.get(i));
}

我猜這是處理它的錯誤方法,因為在編譯時它沒有排序。

我現在想做的是創建兩個ArrayList(一個是firstName,一個是LastName),並說在for循環中,如果(lastName相同)則比較firstName,但是我不確定是否會為此,需要兩個ArrayList,因為看起來不必要的復雜。

所以你怎么看?

編輯:我正在添加一個compareTo(Object other)版本:

public int compareTo(Object other)
{
    int result = 0;
    if (lastName.compareTo(((Owner)other).getLastName()) < 0)
        result = -1;
    else if (lastName.compareTo(((Owner)other).getLastName()) > 0)
        result = 1;
    else if (lastName.equals(((Owner)other).getLastName()))
    {
        if (firstName.compareTo(((Owner)other).getFirstName()) < 0)
            result = -1;
        else if (firstName.compareTo(((Owner)other).getFirstName()) > 0)
            result = 1;
        else if (firstName.equals(((Owner)other).getFirstName()))
            result = 0;
    }
    return result;
}

我認為該對象應實現遵循正常Comparable合同的compareTo方法-搜索多個字段上的排序。 您認為沒有兩個列表是正確的。

如果您可以一開始就控制Owner代碼,請更改代碼,以實現Comparable 它的compareTo()方法執行賦值中描述的lastName / firstName測試。 您的sortOwners()方法將直接將List<Owner>傳遞給Sorts.sort()

如果您無法控制Owner ,請創建一個實現ComparableOwner子類。 OwnerSortable之類。 它在其構造函數中接受一個常規的Owner對象,並僅將compareTo()以外的所有方法委托給包裝的對象。 它的compareTo()將如上所述起作用。 您的sortOwners()方法將從“ Owner列表中創建一個新的List<OwnerSortable> 然后可以將其傳遞給Sorts.sort()

由於這是家庭作業,因此有一些提示:

  1. 假設目標是自己實現排序算法,您會發現將列表元素提取到數組中,對數組進行排序然后重建列表(或創建一個新列表)要容易得多(並且性能更高)。

  2. 如果這不是目標,請查看Collections類。

  3. 實現自定義Comparator ,或更改對象類以實現Comparable

由於您具有對象的ArrayList ,通常我們將使用Collections.sort()方法來完成此任務。 注意方法簽名:

public static <T extends Comparable<? super T>> void sort(List<T> list)

這里重要的是,所有要排序的對象都必須實現Comparable接口,該接口允許以數值方式將對象與另一個對象進行比較。 為了明確起見, Comparable對象具有一個名為compareTo的方法,具有以下簽名:

int compareTo(T o)

現在我們進入了很好的部分。 當一個對象是Comparable ,可以將它與另一個對象進行數值比較。 讓我們看一個示例調用。

String a = "bananas";
String b = "zebras";
System.out.println(a.compareTo(b));

結果將是-24。 從語義上講,由於斑馬線在字典的后面比香蕉更遠,因此我們說香蕉比斑馬線要 (在字典中不是那么遠)。

因此,解決方案現在應該很清楚。 使用compareTo可以按字母順序對對象進行比較。 由於我已經向您展示了如何比較字符串,因此希望您對需要編寫的內容有一個大致的了解。

進行數值比較后,可以使用Collections類對列表進行排序。 但是,由於您擁有自己的分類能力,因此無法使用它不會造成很大的損失。 您仍然可以進行數字比較,這始終是目標! 因此,既然我已經將它們列出了,那么這應該使必要的步驟更加清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM