2017-09-14 71 views
2

我有一個objects的列表,我想根據name進行排序。我已經完成了編碼,它在name的基礎上進行排序,但我有一個不同的要求。Java:使用比較器對對象列表進行排序,並使用屬性的第二個字

的名稱是例如,我有使用下面的代碼當前排序:

Bull AMP 
Cat DEF 
Dog AMP 
Frog STR 
Zebra DEF 

但我想排序第二字的名稱的基礎上的名字。基本上list應該是這樣的:

Bull AMP 
Dog AMP 
Cat DEF 
Zebra DEF 
Frog STR 

下面是我的代碼:

對象類:

public class AnimalData implements Serializable 
{ 
    private static final long serialVersionUID = 3952396152688462601L; 
    public String name; 
    public long age; 
    private String animal; 
    private String animalParts; 
    private String animalType; 
} 

比較級

public class AnimalDataComparer implements Comparator<AnimalData> 
     { 
    @Override 
    public int compare(final AnimalData object1, final AnimalData object2) 
    { 
      return object1.getName().compareTo(object2.getName()); 
    } 
    } 

排序使用集合

private List<AnimalData> AnimalDataList; 

    Collections.sort(AnimalDataList, AnimalDataComparer); 
+0

你的equals方法也需要代表行爲。 –

+1

什麼是AMP,DEF等字段? –

+0

還是那些sufixes字段字符串名稱的一部分? –

回答

1

在Java 8流模式:

Comparator<? super Animal> animalComparator = (a, b) -> { 
     StringTokenizer firstTokenizer = new StringTokenizer(a.getName(), " "); 
     firstTokenizer.nextToken(); 
     StringTokenizer secondTokenizer = new StringTokenizer(b.getName(), " "); 
     secondTokenizer.nextToken(); 
     return firstTokenizer.nextToken().compareTo(secondTokenizer.nextToken()); 
    }; 

    myList = myList.stream().sorted(animalComparator).collect(Collectors.toList()); 
+0

這不是「完整」的Java 8代碼 - 它複製了兩個參數的比較邏輯。 –

+0

好吧,有兩個不同的變量需要比較,因爲它使用StringTokenizer類 – nineunderground

3

你需要自己實現,如下,假設這個詞是name一部分,substring()indexOf()

@Override 
public int compare(final AnimalData object1, final AnimalData object2) 
{ 
    return object1.getName().substring(
     object1.getName().indexOf(" ") 
    ).compareTo(object2.getName().substring(
     object2.getName().indexOf(" ") 
    )); 
} 

如果由於某種原因,你有兩個以上的詞,最後是你想要的,然後使用lastIndexOf()

4

改變你的比較是這樣的:

public class AnimalDataComparer implements Comparator<AnimalData> 
{ 
    @Override 
    public int compare(final AnimalData object1, final AnimalData object2) 
    { 
     return object1.getName().split(" ")[1].compareTo(object2.getName().split(" ")[1]); 
    } 
} 

或使用Java的更新比較API:

Comparator<AnimalData> c = Comparator.comparing(animal -> animal.getName().split(" ")[1]); 

注意,這是假設所有的名字竟然有兩個單詞。如果您不確定,則需要在訪問拆分數組之前進行檢查。除了所有這些,你可能想要考慮其他評論,並在你的構造函數中分割這個名字,並且有兩個字段namecategory。或者你可以寫一個類別的getter,在其中進行分割和驗證。

0

OUTPUT ::

[AnimalData [名稱=狗AMP],AnimalData [名稱=貓DEF],AnimalData [名稱=斑馬DEF],AnimalData [名稱=青蛙STR] ]

import java.io.IOException; 
import java.io.Serializable; 
import java.text.ParseException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class test { 
    public static void main(String[] args) throws IOException, ParseException { 

     AnimalData data1 = new AnimalData("Cat DEF"); 
     AnimalData data2 = new AnimalData("Dog AMP"); 
     AnimalData data3 = new AnimalData("Frog STR"); 
     AnimalData data4 = new AnimalData("Zebra DEF"); 
     List<AnimalData> list = new ArrayList<>(); 
     list.add(data1); 
     list.add(data2); 
     list.add(data3); 
     list.add(data4); 
     Collections.sort(list); 
     System.out.println(list); 

    } 
} 

class AnimalData implements Serializable, Comparable<AnimalData> { 
    private static final long serialVersionUID = 3952396152688462601L; 
    public String name; 
    public long age; 
    private String animal; 
    private String animalParts; 
    private String animalType; 

    public AnimalData(String name) { 
     super(); 
     this.name = name; 
    } 

    @Override 
    public int compareTo(AnimalData o) { 
     String secondPartThis = this.name.split(" ")[1]; 
     String secondPartObject = o.name.split(" ")[1]; 
     return secondPartThis.compareTo(secondPartObject); 
    } 

    @Override 
    public String toString() { 
     return "AnimalData [name=" + name + "]"; 
    } 
相關問題