【问题标题】:Java How order a list of objects with sets of integersJava如何使用整数集对对象列表进行排序
【发布时间】:2018-03-18 12:25:20
【问题描述】:

我有一个具有一些属性的通用对象列表,其中一个是整数的集合(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 的 Comparator 并覆盖方法 compare 但我没有得到它。

谢谢,等你回复

【问题讨论】:

  • 需要描述您希望订购的工作方式。像 1,2 对 1,2,3 吗? 1,2,3 对 2,3 ?你是否比较了每组的第一个数字,然后是每组的下一个数字,这就是你希望你的排序工作的方式?
  • 请显示实际代码。

标签: java generics set compare


【解决方案1】:

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

(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

【讨论】:

  • 只比较每个 Set 中的第一个元素的原因是什么?
  • @user7 你在投票前仔细阅读了这个问题吗?
  • 我同意 OP 的要求并不明确。由于您只比较 Set 中的第一个元素,因此这不适用于 [[2, 3, 4], [2, 3]] ,反之亦然。 (您会认为这两个相同,但 OP 想要 [2,3] 后跟 [2,3,4])
【解决方案2】:

GenericObjectComparator 中,您必须逐一比较Sets 中包含的整数。
您应该依赖 Integer 比较方法,但对于特定情况(相同元素但增加一个),应将具有较少元素的集合放在顺序之前。
就时间而言,它应该是最直接有效的方法。

如果不需要性能(很少的列表和很少的元素),您可以将列表的Integers 累积在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]]]

【讨论】:

  • 这将如何用于 [1, 30] 和 [12]?从 OP,我 预期的输出是 [1,30] 后跟 [12]
猜你喜欢
  • 2019-09-05
  • 2012-04-09
  • 1970-01-01
  • 2018-10-20
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多