【问题标题】:Partially sorting a list based on a boolean value根据布尔值对列表进行部分排序
【发布时间】:2018-01-30 01:44:51
【问题描述】:

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

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

例如,假设我有:

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

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

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

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

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

谢谢!

【问题讨论】:

标签: java java-8


【解决方案1】:

我建议使用以下算法:

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

【讨论】:

    【解决方案2】:

    您可以使用 cmets 中建议的比较器;我还尝试了一些其他方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多