【问题标题】:How to create arraylist without one element from another arraylist如何在没有来自另一个数组列表的一个元素的情况下创建数组列表
【发布时间】:2018-12-15 00:15:44
【问题描述】:

我需要创建一个没有另一个数组列表元素的数组列表,但我需要这个新的数组列表来保持更新。例如,旧的arraylist的一个元素被删除,新的也被删除。

但是我并不想去掉两个arraylist的元素,只去掉旧的,以免有太多代码

(我的方法“showPeople”每 1 秒更新一次)

我的代码:

ArrayList<Person> personList = new ArrayList<>();

private void method(){
   personList.add(new People("Name"))
}

private void showPeople(){
    ArrayList<Person> newPersonList = 
              new ArrayList<>(personList.stream()
                                        .filter(person -> !person.getName().equals("Test"))
                                        .collect(Collectors.toList()))

    for (int i = 0; i < newPersonList.size(); i++){
        gui.show(newPersonList.get(i).getName());
    }
}

问题是当我创建新的arraylist并从旧的删除一个项目时,新的没有更新

【问题讨论】:

  • 难道你不能只保留一个数组列表,并在每次需要获取条目时过滤掉你不想要的对象吗?您应该解释原因,我认为肯定有更好的解决方案来解决您的问题。
  • 我已经这样做了,但是没有用
  • 您调用的方法的顺序是什么?因为这里看起来每次调用 showPeople 时都会使用 personList 的 current 元素。因此,如果您从中删除或添加一些项目,当您稍后调用 showPeople 时,也会出现这样的更改。顺便说一句,您也可以将 .collect 替换为 .forEach(p -&gt; gui.show(p.getName())),而不是在 newPersonList 中收集流

标签: java arraylist


【解决方案1】:

您正在制作列表的多个副本;相反,请执行以下操作:

List<Person> filterPeople(List<Person> people, @NotNull String name) {
    return people.stream()
        .filter(person -> !name.equals(person.getName()))
        .collect(Collectors.toList());
}

如果您对 List 的形状缺乏保证感到不舒服,您可以明确表示:

        .collect(Collectors.toCollection(ArrayList::new));

不过,目前还不清楚你在问什么。我建议你提供一个minimal, complete, and verifiable example

【讨论】:

  • 我忘了提,但我的列表在 HashMap 内,即使从 hashmap 内的列表中删除元素,它似乎也没有创建一个我必须创建的新数组列表也从中删除元素。仅在我退出并进入 GUI 时更新,甚至每 1 秒更新一次
  • @Slinidy -- 通过提供适当的最小、完整和可验证的示例来帮助我们帮助您。
【解决方案2】:

如果您希望不包含该元素的列表不断更新,您可以通过扩展AbstractList 来创建列表视图。

API 文档包含有关您需要覆盖的方法的说明。如果您不想通过视图修改列表,您需要做的就是覆盖 getsize 方法:

class ListView extends AbstractList<String> {
  private final List<String> delegate;  // Initialize in constructor.

  public T get(int i) {
    int pos = delegate.indexOf("Test");
    if (pos < 0 || i < pos) return delegate.get(i);
    return delegate.get(i + 1);
  }

  public int size() {
    return delegate.size() - (delegate.contains("Test") ? 1 : 0);
  }
}

这将重复搜索"Test" 元素,因为视图无法知道其下方的委托列表是否已更新。

【讨论】:

  • 我需要在这种情况下过滤特定元素:delegate.indexOf("Test");
【解决方案3】:

你可以使用它:List&lt;String&gt; elements = list.stream().distinct().collect(Collectors.toList()); 这将删除重复项。

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多