在特定索引之前和之后,从列表中删除所有元素

3
在Java中,有没有一种方法可以从List中删除除给定索引之外的所有元素?假设我们有以下内容:
List<String> foo = new ArrayList<>();
foo.add("foo0");
foo.add("foo1");
foo.add("foo2");
foo.add("foo3");
foo.add("foo4");

我希望保留索引为2(foo2)的元素,删除所有其他字符串。

我需要一个方法:给定一个字符串列表和一个索引,删除该列表中索引之前和之后的所有元素。我该如何实现这个目标?

谢谢!


1
你必须将相同的“List”实例分配给“foo”吗? 列表中是否有重复项? - ernest_k
难道直接获取该元素并删除列表不是更容易吗? - Joakim Danielson
是的,我没有任何重复项,我需要一个方法从给定列表中删除所有元素,给定一个索引。 - Nexussim Lements
尽管问题要求第一个元素,但是这里的答案是索引参数化的:https://dev59.com/PnA75IYBdhLWcg3wy8br 这可能会有所帮助。 - vahdet
2
Collections.swap(foo, 0, 2); foo.subList(1, foo.size()).clear(); - Holger
显示剩余3条评论
6个回答

1
foo.subList(0, 2).clear(); // after execution of that line Your index 2 object  is on index 0.
foo.subList(1, foo.size()).clear();

现在你的列表foo只包含一个元素,该元素最初位于索引2处。
更新:
public void RemoveAllExceptIndex(List<String> foo,int index) {
    foo.subList(0, index).clear();
    foo.subList(1, foo.size()).clear();
}

我该如何将其转换为一个方法,例如:给定一个字符串列表和一个给定的索引,删除该列表中索引之前和之后的所有元素? - Nexussim Lements
1
如果需要就地编辑列表,这是正确的想法。我为@KhalidShah尝试回答OP的问题而鼓掌。但是这段代码不正确。你真的尝试过吗?只需创建一个包含几个元素的列表并尝试一下,你会发现它并没有达到预期的效果。 - CryptoFool
1
我意识到我可以编辑你的答案,而不是发布一个社区替代方案。我已经这样做了。 - CryptoFool

1
你可以这样做:

Arrays.asList(foo.get(2));

或者

Collections.singletonList(foo.get(2))

因此,您可以实现以下方法:

// Returns a fixed-size list ..
public List<String> subList(List<String> list, int index) {
    return Arrays.asList(list.get(index));
}

或者

public List<String> subList(List<String> list, int index) {
        return Collections.singletonList(list.get(index));
    }

或者

public List<String> subList(List<String> list, int index) {
    return list.subList(index, ++index);
}

1
返回一个固定大小的列表,新列表的大小无法更改。 - user85421
3
为什么要绕道使用数组?直接使用 Collections.singletonList(…) - Holger

0
List<String> list2 = Arrays.asList(foo.get(2));
// you can keep foo list or empty it later.

1
返回一个固定大小的列表... - user85421

0

你可以像这样做,以保留旧列表。

foo.retainAll(Collections.singleton(foo.get(2)));

这将保留所有指定值的出现,而不仅仅是一个。此外,使用Collections.singleton(...)获取单个元素集合而无需创建数组。还有一个缺失。 - Holger
谢谢你提供Collections.singleton()的提示,我之前不知道这个方法。 - Marcel Goldammer

0
这个怎么样?
foo = foo.subList(2, 3);

转换为一个方法,就像这样:

public List<String> subList(List<String> list, int index)
{
    return list.subList(index, index + 1);
}

或者如果您不想重新分配原始列表:

public void subList(List<String> list, int index)
{
  String elm;
  elm = list.get(index);
  list.clear();
  list.add(elm);
}

我该如何将其转换为一个方法,例如:给定一个字符串列表和一个给定的索引,删除该列表中索引之前和之后的所有元素? - Nexussim Lements
更新了答案。 - Robert Kock

0

在Java-8中,您可以像下面这样做:

    List<String> li = Arrays.asList("foo0", "foo1", "foo2", "foo3");
    List<String> finalList = li.stream().filter(s -> s.compareTo("foo2") == 0).findAny() ;
    System.out.println(finalList);
列表->->应用过滤器->收集为新的列表 s.compareTo("foo2") == 0 可以确保只有 foo2 能通过 filter() 过滤。

1
这将保留所有指定值的出现,而不是指定索引处的元素。除此之外,没有理由使用s.compareTo("foo2") == 0而不是直接使用s.equals("foo2") - Holger
findfirst() 在这里是否合适?因为操作者想要第一次出现的情况.. @holger,对吗? - Vishwa Ratna
1
OP特别说明了索引是给定的,但对于String元素来说,保留哪个相等的字符串并不重要,因此可以使用findAny() - Holger
@holger,感谢你的推荐。我现在正在乘坐出租车从办公室出发,所以无法编辑回答。 - Vishwa Ratna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接