Java 如何对包含整数集的对象列表进行排序



我有一个带有一些属性的通用对象列表,其中一个是整数的集合(treeSet(。

class GenericObject{
    Set<Integer> orderNumbers = new TreeSet<>();
    Other attributes...
}

我想对这个通用对象列表进行排序,比较 Set...例:

我的实际列表列表;
具有集合的泛型对象 --> 2,3,4
带有集合的泛型对象 --> 1,2
具有集合的泛型对象 --> 4,5
具有集合的泛型对象 --> 2,3

我想像这样对对象列表进行排序:
1( 1,2
2( 2,3
3( 2,3,4
4,5

我正在尝试实现通用对象的比较器并覆盖方法比较,但我没有得到它。

谢谢,我会等待你的回答

由于orderNumbers是一个Set元素将按其自然顺序排列,因此您可以比较它的第一个元素和大小。这是比较器:

(a, b) -> {
    Integer nexta = a.orderNumbers.iterator().next(),
            nextb = b.orderNumbers.iterator().next();
    if( nexta == nextb ) {
        return a.orderNumbers.size() > b.orderNumbers.size() ? 1 : -1;
    }
    return Integer.compare(nexta, nextb);
}

演示

GenericObject Comparator中,您必须逐个比较Set中包含的整数。
您应该依赖 Integer 可比较方法,但对于特定情况(相同的元素但有一个额外的元素(,其中具有较少元素的集合应放在顺序中。
就时间而言,这应该是最直接有效的方法。

如果不需要性能(很少的列表和很少的元素(,您可以将列表的Integer累积到String中,并执行字典顺序比较,因为最终这就是您需要的。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
class GenericObject {
    private Set<Integer> orderNumbers;
    public GenericObject(Set<Integer> treeSet) {
        this.orderNumbers = treeSet;
    }
    // Other attributes...
    public static void main(String[] args) {
        List<GenericObject> list = new ArrayList<>();
        list.add(new GenericObject(new TreeSet<>(Arrays.asList(2, 3, 4))));
        list.add(new GenericObject(new TreeSet<>(Arrays.asList(1, 2))));
        list.add(new GenericObject(new TreeSet<>(Arrays.asList(4, 5))));
        list.add(new GenericObject(new TreeSet<>(Arrays.asList(2, 3))));
        list.sort(new Comparator<GenericObject>() {
            @Override
            public int compare(GenericObject o1, GenericObject o2) {
                String o1String = o1.orderNumbers.stream()
                                                 .map(Object::toString)
                                                 .reduce("", String::concat);
                String o2String = o2.orderNumbers.stream()
                                                 .map(Object::toString)
                                                 .reduce("", String::concat);
                return o1String.compareTo(o2String);
            }
        });
        System.out.println(list);
    }
    @Override
    public String toString() {
        return "GenericObject [orderNumbers=" + orderNumbers + "]";
    }
}

输出:

[GenericObject [orderNumbers=[1, 2

]], GenericObject [orderNumbers=[2, 3]], 通用对象 [orderNumbers=[2, 3, 4]], 通用对象 [订单号=[4, 5

]]]

相关内容

  • 没有找到相关文章

最新更新