2014-10-29 34 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)