【问题标题】:Remove all elements from a List after and before a particular index从列表中删除特定索引之后和之前的所有元素
【发布时间】:2019-08-20 09:35:19
【问题描述】:

Java 中是否有任何方法可以从 List 中删除除给定索引之外的所有元素?假设我们有:

List<String> foo = new ArrayList<>();
foo.add("foo0");
foo.add("foo1");
foo.add("foo2");
foo.add("foo3");
foo.add("foo4");

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

我需要一个类似的方法:给定一个字符串列表和一个给定索引,删除该列表中索引前后的所有元素 我怎样才能实现这个目标?

干杯

【问题讨论】:

  • 您是否必须保留分配给foo 的相同List 实例?列表中有重复项吗?
  • 获取该元素并删除列表不是更容易吗?
  • 是的,我没有任何重复项,我需要一种方法,在给定索引的情况下从给定列表中删除所有元素
  • 虽然问题要求第一个元素,但答案在这里是索引参数化的:stackoverflow.com/q/3099527/4636715 它可能会有所帮助。
  • Collections.swap(foo, 0, 2); foo.subList(1, foo.size()).clear();

标签: java arrays arraylist java-8 indexof


【解决方案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();
}

【讨论】:

  • 我怎样才能把它转换成这样的方法:给定一个字符串列表和一个给定的索引,删除索引之前和之后该列表的所有元素?
  • 如果需要就地编辑列表,这是正确的想法。我为您@KhalidShah 尝试回答 OPs 问题而鼓掌。但是这段代码并不正确。你真的试过了吗?只需创建一个包含一些元素的列表并尝试一下,您会发现它并没有达到预期的效果。
  • 我意识到我可以编辑您的答案,而不是发布社区替代方案。我做到了。
【解决方案2】:

你可以这样做:

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);
}

【讨论】:

  • 但请注意,新列表的大小无法更改 - “返回一个固定大小的列表...”
  • 为什么要绕道而行。只需使用Collections.singletonList(…)
【解决方案3】:

这个呢:

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);
}

【讨论】:

  • 我怎样才能把它转换成这样的方法:给定一个字符串列表和一个给定的索引,删除索引之前和之后该列表的所有元素?
  • 更新了答案
【解决方案4】:
List<String> list2 = Arrays.asList(foo.get(2));
// you can keep foo list or empty it later.

【讨论】:

  • 但请注意,新列表的大小无法更改 - “返回固定大小的列表...”
【解决方案5】:

您可以这样做来保留旧列表。

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

【讨论】:

  • 这将保留所有出现的指定值,而不是一个。除此之外,使用Collections.singleton(…) 来获取单个元素集,而无需创建数组。还有一个) 不见了。
  • 感谢Collections.singleton() 提示。不知道。
【解决方案6】:

在 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);

列表->->Apply_Filter->Collect_to_new_List

s.compareTo("foo2") == 0 ,确保只有foo2 传递filter()

【讨论】:

  • 这将保留所有出现的指定值,而不是指定索引处的元素。除此之外,没有理由使用s.compareTo("foo2") == 0 而不是直截了当的s.equals("foo2")
  • findfirst() 会适合这个地方吗?由于 op 想要第一次出现.. @holger ,对吗??
  • OP 明确表示给出了索引,但是对于 String 元素,保留哪个相等的字符串并不重要,所以 findAny() 会这样做。
  • @holger,感谢男士的建议。我现在从办公室坐出租车,所以无法编辑答案。?
猜你喜欢
  • 1970-01-01
  • 2015-03-26
  • 2016-02-12
  • 2019-06-25
  • 2014-04-02
  • 2017-02-03
  • 2015-10-13
  • 1970-01-01
  • 2016-08-16
相关资源
最近更新 更多