【问题标题】:Java collection suggestionJava收藏建议
【发布时间】:2017-12-25 13:36:35
【问题描述】:

我有一个方法如下

  public List<List<CustomClass>> categorize(List<CustomClass> customClass){
        List<List<CustomClass>> returnValue = new ArrayList<>();
        for (CustomClass customClassValue: customClass) {
              List<CustomClass> one = new ArrayList<>(), two = new ArrayList<>(), three = new ArrayList<>(), four = new ArrayList<>();
              switch (customClassValue.getAge()){
              case 1:
                    one.add(customClassValue);
                    break;
              case 2:
                    two.add(customClassValue);
                    break;
              case 3:
                    three.add(customClassValue);
                    break;
              case 4:
                    four.add(customClassValue);
                    break;
              }
              returnValue.add(one);
              returnValue.add(two);
              returnValue.add(three);
              returnValue.add(four);
        }
        return returnValue;
  } 

从有效性和性能的角度来看,除了使用List&lt;List&lt;CustomClass&gt;&gt; 之外,java 集合中还有其他选择吗?

简单描述一下函数的作用:

获取自定义对象列表的输入,并根据对象中的字段对其进行分类,并分别返回每个类别项。

【问题讨论】:

  • 包含List 的自定义类呢?而不是 List&lt;List&lt;CustomClass&gt;&gt;List&lt;CustomClass&gt; 并将第二个 List 放在您的自定义类中。
  • 简单描述一下该函数的作用:获取自定义对象列表的输入,并根据对象中的字段对其进行分类,并分别返回每个类别项。
  • 您正在创建许多列表,其中四分之一有一个 CustomClass,而其他列表是空的。你确定这是你想要做的吗?
  • 不创建列表并将它们添加到 returnValue 将超出 for 循环
  • @Venkat 不在您提供的代码中。如果您想获得有用的答案,也许您应该提供您正在使用的真实代码。

标签: java android performance collections


【解决方案1】:

当您想将事物分类到桶中时,我的第一反应是使用Map 而不是List。根据年龄将List&lt;CustomClass&gt; 划分为子列表似乎是使用Map&lt;Integer, List&lt;CustomClass&gt;&gt; 的最佳时机。这是一种方法:

    public Map<Integer, List<CustomClass>> categorize(List<CustomClass> customClass) {
        Map<Integer, List<CustomClass>> returnValue = new HashMap<>();

        for (CustomClass customClassValue: customClass) {
            List<CustomClass> sublist = returnValue.get(customClassValue.getAge());

            if (sublist == null) {
                sublist = new ArrayList<>();
                returnValue.put(customClassValue.getAge(), sublist);
            }

            sublist.add(customClassValue);
        }

        return returnValue;
    }

【讨论】:

    【解决方案2】:

    MultimapMap&lt;Key, List&lt;Value&gt;&gt; 的更简洁版本,Google 的 Guava 有一个很好的实现。它应该可以解决您遇到的问题。

    【讨论】:

      【解决方案3】:

      试试这个。

      public List<List<CustomClass>> categorize(List<CustomClass> customClass) {
          return customClass.stream()
              .filter(v -> v.getAge() >= 1 && v.getAge() <= 4)
              .collect(
                  () -> IntStream.range(0, 4)
                      .mapToObj(i -> new ArrayList<CustomClass>())
                      .collect(Collectors.toList()),
                  (list, v) -> list.get(v.getAge() - 1).add(v),
                  (a, b) -> {});
      }
      

      【讨论】:

      • 感谢优化代码,但我在使用 java V1.7 时受到限制
      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多