【问题标题】:Best way to split an arraylist based on a category根据类别拆分数组列表的最佳方法
【发布时间】:2013-12-15 17:41:37
【问题描述】:

我有一个 ArrayList,其中 DataType 是一个类:

class DataType {
  String id;
  String dType;
  String description;
  // setters and getters follow
}

使用给定的ArrayList<Datatype>,我想创建子列表,这样每个子列表都具有相同的dType 值。即所有DataType 具有相同dType 值的对象应位于一个子列表中,依此类推。

此外,所有子列表都将添加到创建时的ArrayList<ArrayList<Datatype>>

有人可以为此建议最合适的方法吗?

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    我这样做的方法是创建一个地图:

    Map<String, List<DataType>> data;
    

    然后遍历你的原始数组,对于每个值,使用 dType 作为键将它们插入到 Map 中。

    for (DataType dt: toSort) {
        List<DataType> list = data.get(dt.dType);
        if (list == null) {
            list = new ArrayList<>();
            data.put(dt.dType, list);
        }
        list.add(dt);
    }
    

    现在你已经把它们都整理好了。

    【讨论】:

    • 这是最好的解决方案之一..谢谢
    【解决方案2】:

    我会创建一个哈希映射:HashMap&lt;DataType, List&lt;Data&gt;&gt;。确保为 DataType 类覆盖 equals()hashCode()

    【讨论】:

      【解决方案3】:

      一种选择是通过手动迭代列表来创建HashMap&lt;String, List&lt;DataType&gt;&gt;。除此之外,如果您可以使用 3rd 方库,请考虑使用Guava's Multimaps.index 方法:

      Function<DataType, String> groupFunction = new Function<DataType, String>() {
              @Override
              public String apply(DataType dataType) {
                  return dataType.getDType();
              }
      };
      
      ImmutableListMultimap<String, DataType> grouped = Multimaps.index(persons, groupFunction);
      
      System.out.println(grouped);
      

      【讨论】:

      • 是的,使用 HashMap> 是最好的解决方案之一。我需要检查是否可以使用 3rd 方库。在那种情况下,这绝对是最好的方法......我实际上正在寻找的东西......你能否详细说明 apply 方法将如何对具有相同 dType 值的元素进行分组......是否存在任何类似的概念在 apache.commons.collections 中?
      猜你喜欢
      • 2021-08-05
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2011-10-18
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多