在混合列表中仅对一个类别的对象进行排序

时间:2018-11-14 13:52:07

标签: java sorting

请考虑以下来自两个类(AC)的对象的列表,

  

C3,A2,C1,A1,A3

我只想对A类型的对象进行排序(其他类型的对象保留在其位置),以便输出看起来 像这样:

  

C3,A1,C1,A2,A3

在Java中是否有任何 直接 方法?

P.S。简单地说,我的意思是,无需实现自定义算法,也无需使用Java类。

3 个答案:

答案 0 :(得分:1)

我怀疑您能否提出一个Comparator,其中包含执行此操作的逻辑,并且肯定不是一个简单的比较器。因此,仅对原始数组进行排序而无需编写自己的排序算法似乎已经解决了。

我的方法是通过剥离C元素(因此它仅包含A元素)来生成第二个数组,使用标准Java类对其进行排序,然后重新插入C个元素处于正确位置。在插入元素时,如果要更改排序的数组长度,则必须对索引稍加小心,但计算起来应该很简单。

答案 1 :(得分:1)

可能不是最简单的解决方案,而是一种(被黑客攻击*)方法:

将所有A对象添加到新的List中并对其进行排序:

List<A> list2 = new ArrayList<>();
list2.add(a2);
list2.add(a1);
list2.add(a3);
Collections.sort(list2, new Comparator<A>() {
    @Override
    public int compare(A a1, A a2) {
        return a1.getName().compareTo(a2.getName());
    }
});

然后有一个最终列表,如果类型为C,则从原始列表中添加,否则从排序后的A列表中添加:

List<Object> resultSet = new ArrayList<>();
int it = 0;
for (Object obj : list) {
    if (obj instanceof C) {
       resultSet.add(obj);
   } else {
       resultSet.add(list2.get(it));
        it++;
    }

}

Example

* 请注意,这只是为了了解操作方法,不是复制的好方法。

答案 2 :(得分:0)

您可以像通常对列表进行排序一样对它进行排序,但是可以使用.getClass().getClass().getSimpleName()来判断它们是在A类还是C类中,以及实例的名称是什么