繁体   English   中英

Java如何使用整数集对对象列表进行排序

[英]Java How order a list of objects with sets of integers

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

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

我想订购此通用对象列表,并比较Set ...示例:

我的实际列表清单;
带有Set的GenericObject-> 2,3,4
带有Set的GenericObject-> 1,2
带有Set的GenericObject-> 4,5
带有Set的GenericObject-> 2,3

我想要订购这样的对象列表:
1)1,2
2)2,3
3)2,3,4
4)4,5

我正在尝试实现GenericObject的比较器,并覆盖比较方法,但是我没有。

谢谢,我会等你的答案

由于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);
}

DEMO

GenericObject Comparator您将必须GenericObject Comparator Set包含的Integer。
您应该依靠Integer可比方法,但对于特定情况(相同元素,但又有一个附加元素),应将具有较少元素的集合放置在顺序的前面。
就时间而言,它应该是最直接有效的方法。

如果不需要性能(很少的列表和很少的元素),则可以将String的List的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]],GenericObject [orderNumbers = [2、3、4]],GenericObject [orderNumbers = [4、5]]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM