【问题标题】:How can I get a non-inclusive subset of a List?如何获得列表的非包含子集?
【发布时间】:2015-11-22 15:24:11
【问题描述】:

Java 列表是否具有从列表中选择索引子集的方法?

例如,输入[1, 4, 5] 的列表[a, b, c, d, e, f, g] 应该输出[a, d, e]

【问题讨论】:

  • 我使用的是 java 7,但是 java 8 的方式是什么?
  • Collections 类中没有这样的方法,但是你可以通过一个简单的循环来获得它。

标签: java arraylist filter


【解决方案1】:

这在 Java 8 中非常简单,只需确保在索引上使用流,而不是在对象上,并使用.map;

public static void main(String[] args) {
  List<String> stringList = Arrays.asList("a", "b", "c", "d");
  List<Integer> indices = Arrays.asList(1, 3);

  List<String> resultList = indices.stream()
                  .map(i -> stringList.get(i))
                  .collect(Collectors.toList());

  System.out.println(resultList);
}

在 Java 7 中也没有那么难:

public static void main(String[] args) {
  List<String> stringList = Arrays.asList("a", "b", "c", "d");
  List<Integer> indices = Arrays.asList(1, 3);

  List<String> resultList = new ArrayList<>();

  for(int i : indices) {
    resultList.add(stringList.get(i));
  }

  System.out.println(resultList);  
}

在这两种情况下,输出都是:

[b, d]

【讨论】:

  • 我一直在寻找一种本地方式来做到这一点,这正是我正在使用的
【解决方案2】:

使用LinkedHashMap 仅使用一个循环,因为在 Collection 类中没有这种特殊的方法来获取列表的子集(index-wise)。 p>

代码:

public static void main(String[] args) {
        List<Character> ls = new ArrayList<Character>();
        ls.add('a');
        ls.add('b');
        ls.add('c');
        ls.add('d');
        ls.add('e');
        ls.add('f');
        ls.add('g');
//EDIT
    int subIndex[] = new int[] { 1, 4, 5 };
    Map<Integer, Character> result = new LinkedHashMap<>();

    for (int i = 0; i < subIndex.length; i++) {
        result.put(i, ls.get(subIndex[i] - 1));
    }
    System.out.println(result.values());    
}

输出: [a, d, e]

我希望这会有所帮助。

【讨论】:

  • 其实我觉得这个的输出是ade,而不是[a, d, e]
  • @durron597,感谢您提出此问题。它的输出是'ade'或a d e(都在不同的行中(println()))。
  • @durron597,请立即查看。感谢提及。
猜你喜欢
  • 2013-04-09
  • 2021-03-05
  • 1970-01-01
  • 2023-01-28
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多