我有一个包含以下元素的列表。
List<String> numbers = new ArrayList<String>();
numbers.add("1");
numbers.add("2");
numbers.add("3");
如何在不说"1"
的情况下获取列表的子集?是否有一个更简单的函数可以对任何类型的List起作用。
答案 0 :(得分:7)
这个问题含糊不清。
numbers.remove("1");
将删除任何列表中的第一个“1”实例。如果您可能有重复的元素,请使用numbers.removeAll (Collections.singletonList ("1"));
删除所有元素。
另一方面,如果您希望获得列表的子范围,请使用subList
方法。
答案 1 :(得分:3)
你可以查看Guava libraries,它对任何集合类型都有一个过滤方法
这里有some examples供您参考。
如果您不想使用第三方库,则必须手动迭代列表,并且需要复制与您的条件不符的元素。
答案 2 :(得分:3)
您可以使用Guava创建过滤的Collection
视图:
Collection<String> filtered = Collections2.filter(numbers,
Predicates.not(Predicates.equalTo("1")));
这是原始List
的实时视图,因此创建效率非常高,但使用效率可能不高,具体取决于您需要使用它的方式以及过滤后的集合与原始集合的比较小。如果更好的话,您可以将其复制到新列表中:
List<String> filteredList = Lists.newArrayList(filtered);
创建包含除您不想要的元素之外的所有元素的副本列表的最简单方法是使用简单的for
循环:
List<String> copy = new ArrayList<String>();
for (String number : numbers) {
if (!"1".equals(number))
copy.add(number);
}
如果您想要修改原始列表,numbers.removeAll
就是您想要的(如@Robin Green所述)。
答案 3 :(得分:1)
答案 4 :(得分:0)
是的,例如,从您可以执行的列表中删除1
:
int i = 0;
while((i = numbers.indexOf("1")) > -1) {
numbers.remove(i);
}
您也可以使用对象列表或过滤条件来执行此操作。
编辑:只会有一个而不是很多?然后就做:
int i = 0;
if((i = numbers.indexOf("1")) > -1) {
numbers.remove(i);
}
答案 5 :(得分:0)
我认为这可以为您提供帮助:
final List<String> numbers = Arrays.asList("1", "2", "3");
final List<String> filtered = numbers.stream()
.filter(num -> !"1".equals(num))
.collect(Collectors.toList());
答案 6 :(得分:0)
从Java8开始,可以使用流api,例如:
final List<String> list = Arrays.asList("1", "2", "3", "4", "5");
final List<String> listToExclude = Arrays.asList("2", "3");
final List<String> filtered = list.stream()
.filter(item -> !listToExclude.contains(item))
.collect(Collectors.toList());
System.out.println(filtered); // returns {"1", "4", "5"}