2014-10-29 111 views
1

我已經知道如何對ArrayList進行排序了,但是我想知道是否可以使用兩個參數對數組進行排序,例如:我有一個數組,其中有一個浮點數和一個String類似的對象即:用兩個參數對數組進行排序

- object 1 : 0 "DD" 
- object 2 : 3 "FF" 
- object 3 : 1 "GG" 
- object 4 : 2 "AA" 
- object 5 : 1 "AA" 

而且我想這樣對它們進行排序:

- object 1 : 0 "DD" 
- object 5 : 1 "AA" 
- object 3 : 1 "GG" 
- object 4 : 2 "AA" 
- object 2 : 3 "FF" 

是否有可能將其與由Float.compare()String.compare()乘以一個比較排序? 或者您是否需要先用Float.compare()對它們進行排序,然後創建子陣列以與String.compare()進行比較?

+1

'regex'和'sorting'的混合就足夠了。使用':'作爲'String.split()'中的分隔符,然後使用'Arrays.sort()'對這些數組進行排序。 – 2014-10-29 07:20:11

+0

[由兩個字段的Java排序問題]可能的重複(http://stackoverflow.com/questions/4805606/java-sort-problem-by-two-fields) – cheseaux 2014-10-29 07:21:21

回答

3

是的,當然。你只需要通過他們的浮點值進行比較的元素,如果其浮點值相等,他們通過自己的字符串值進行比較的比較:

public class FooComparator implements Comparator<Foo> { 
    @Override 
    public int compare(Foo f1, Foo f2) { 
     int result = Float.compare(f1.getFloatValue(), f2.getFloatValue()); 
     if (result == 0) { 
      result = f1.getStringValue().compareTo(f2.getStringValue()); 
     } 
     return result; 
    } 
} 

的Java 8甚至可以爲你做的:

Comparator<Foo> c = Comparator.comparingDouble(Foo::getFloatValue) 
           .thenComparing(Foo::getStringValue); 
+0

+1從Acache Commons我創建了有用的'ChainComparator' https ://commons.apache.org/proper/commons-collections/javadocs/api-2.1.1/org/apache/commons/collections/comparators/ComparatorChain.html – Ezequiel 2014-10-29 07:28:30

2

您需要定義類爲Comparable

public MyClass implements Comparable<MyClass> { 
    private float f; 
    private String s; 

    @Override 
    public int compare (MyClass other) { 
     int first = Float.compare(f, other.f); 
     if (first != 0) { 
      return first; 
     } 

     return s.compare(other.s); 
    } 
} 

然後只需調用Arrays.sort(myList)