基于布尔值对列表进行部分排序

时间:2017-08-21 22:21:37

标签: java java-8

假设我有一个对象列表,我想根据对象的某个属性是否包含特定字符串在同一列表中对它们进行分区。

SomeClassA someClass: 
   String attributeA;
   ... (other attributes)

例如,说我有:

List<SomeClassA> someListA = (a list of SomeClassA); 

我想在SomeClassA不包含字符串的所有实例之后放置attributeA attributeA包含“_DUD”的所有实例。

一种选择: 我知道我们可以循环遍历List,根据条件是否为true(包含“_DUD”)创建并添加到两个列表,然后在第一个列表之后添加第二个列表,但有没有办法在没有创建这些中间列表?

我宁愿不做一个完整的排序,因为订单并不重要。我们只想将包含_DUD属性的所有实例放在一起。

(这是一个简单的例子,当然会替换名称,但我希望它能满足整体需求)

谢谢!

2 个答案:

答案 0 :(得分:2)

我建议使用以下算法:

  • 从列表的开头开始查找包含“_DUD”的下一个元素
  • 从列表末尾开始查找不包含“_DUD”的下一个元素
  • 交换元素
  • 重复直至见面

答案 1 :(得分:0)

您可以使用评论中建议的比较器;我也玩了一些其他方法:

newList = "A_DUD", "B_DUD", "nope", "nope2", "C_DUD", "D_DUD", "nope3"


for (int i = list.size() - 1; i > 0; --i) {

        if (!newList.get(i).contains("_DUD") && !newList.get(i - 1).contains("_DUD")) {
            int j = i - 1;
            do {
                --j;
            } while (j >= 0 && !newList.get(j).contains("_DUD"));

            if (j < 0) {
                break;
            }

            Collections.swap(newList, j, j + 1);
            ++i;
        }

        else if (!newList.get(i).contains("_DUD") && newList.get(i - 1).contains("_DUD")) {
            Collections.swap(newList, i, i - 1);
        }
    }