[英]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
,請創建一個實現Comparable
的Owner
子類。 OwnerSortable
之類。 它在其構造函數中接受一個常規的Owner
對象,並僅將compareTo()
以外的所有方法委托給包裝的對象。 它的compareTo()
將如上所述起作用。 您的sortOwners()
方法將從“ Owner
列表中創建一個新的List<OwnerSortable>
。 然后可以將其傳遞給Sorts.sort()
。
由於這是家庭作業,因此有一些提示:
假設目標是自己實現排序算法,您會發現將列表元素提取到數組中,對數組進行排序然后重建列表(或創建一個新列表)要容易得多(並且性能更高)。
如果這不是目標,請查看Collections
類。
實現自定義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.