How to sort an array of objects containing null elements?

后端 未结 5 1804
梦谈多话
梦谈多话 2020-11-27 23:24

In my program an array fClasses of fixed length [7] of objects is created, each object is a class FClass that contains 3 Strings, an <

相关标签:
5条回答
  • 2020-11-27 23:50

    By importing the org.apache.commons.collections.comparators package of the Apache 2.1.1 Release library, I'm able to sort a list, such as an ArrayList<String>, using the NullComparator as the second argument of the Collections.sort() method, as follows:

    ArrayList<String> list = new ArrayList<String>();
    list.add("foo");
    list.add("bar");
    list.add("baz");
    list.add(null);
    
    // Sort the list
    Collections.sort(list, new NullComparator(true));
    
    System.out.println(list);
    // outputs:
    // [bar, baz, foo, null]
    

    The thing I like about this approach is that the NullComparator has an overload constructor which allows you to specify whether you want null to be considered a high value or a low value, which seems pretty intuitive to me.

    NullComparator(boolean nullsAreHigh)
    

    Hope this helps someone!

    0 讨论(0)
  • 2020-11-27 23:58

    With Apache Commons Collections 4 you can use ComparatorUtils to do that:

    Collections.sort(arr, ComparatorUtils.nullLowComparator(ComparatorUtils.NATURAL_COMPARATOR));
    
    0 讨论(0)
  • 2020-11-27 23:59

    Using Java 8, you can easily build the comparator you need:

    Arrays.sort(fClasses, Comparator.nullsFirst(Comparator.naturalOrder()));
    

    Use nullsLast instead if that's what you want, of course.

    0 讨论(0)
  • 2020-11-28 00:02

    You have to create a Comparator<FClass>, rather than use a Comparable<FClass>.

    public class FClassComparator implements Comparator<FClass> 
    {
        public int compare(FClass left, FClass right) {
            // Swap -1 and 1 here if you want nulls to move to the front.
            if (left == null) return right == null ? 0 : 1;
            if (right == null) return -1;
            // you are now guaranteed that neither left nor right are null.
    
            // I'm assuming avg is int. There is also Double.compare if they aren't.
            return Integer.compare(left.avg, right.avg); 
        }
    }
    

    Then call sort via:

    Arrays.sort(fClassArray, new FClassComparator());
    
    0 讨论(0)
  • 2020-11-28 00:08

    You need your own Comparator implementation and check for nulls and return 0

     Arrays.sort(fClasses, new Comparator<FClass>() {
        @Override
        public int compare(FClass o1, FClass o2) {
            if (o1 == null && o2 == null) {
                return 0;
            }
            if (o1 == null) {
                return 1;
            }
            if (o2 == null) {
                return -1;
            }
            return o1.compareTo(o2);
        }});
    
    0 讨论(0)
提交回复
热议问题