如何在没有另一个数组列表中的一个元素的情况下创建数组列表

时间:2018-12-14 15:40:21

标签: java arraylist

我需要创建一个没有另一个arraylist元素的arraylist,但是我需要这个新的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());
    }
}

问题是,当我创建新的数组列表并从旧列表中删除一项时,新列表不会更新

3 个答案:

答案 0 :(得分:2)

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

package program;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class TempList {

  public static void main(String[] args) {

    /*************************************************/
    /****************Assigning Values*****************/
    /*************************************************/
    String[] names = {
      "A",
      "B",
      "C",
      "D",
      "E"
    };
    List < ComparableTest > objects = new LinkedList < > ();

    /*************************************************/
    /****************Printing Values******************/
    /*************************************************/

    for (String name: names) {
      objects.add(new ComparableTest(name, new Random().nextInt(100)));
    }

    System.out.println("Before Sorting");

    for (ComparableTest object: objects) {
      System.out.println(object.name + " " + object.marks);
    }

    /*************************************************/
    /*************Sorting based on marks**************/
    /*************************************************/

    Collections.sort(objects);
    System.out.println("\nSorting based on Marks");

    for (ComparableTest object: objects) {
      System.out.println(object.name + " " + object.marks);
    }

    /*************************************************/
    /*************Sorting based on names**************/
    /*************************************************/

    System.out.println("\nSorting based on Names");

    Collections.sort(objects, new Comparator < ComparableTest > () {

      @Override
      public int compare(ComparableTest o1, ComparableTest o2) {
        if (o1.name.compareTo(o2.name) < 1) {
          return 1;
        }
        return -1;
      }

    });

    for (ComparableTest object: objects) {
      System.out.println(object.name + " " + object.marks);
    }
  }

}

如果您对List<Person> filterPeople(List<Person> people, @NotNull String name) { return people.stream() .filter(person -> !name.equals(person.getName())) .collect(Collectors.toList()); } 的形状缺乏保证感到不满意,则可以明确:

List

但是,您仍然不清楚您要问什么。建议您提供一个minimal, complete, and verifiable example

答案 1 :(得分:0)

如果希望不带元素的列表不断更新,则可以通过扩展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"元素,因为该视图无法知道委托列表下方是否已更新。

答案 2 :(得分:-1)

您可以使用:List<String> elements = list.stream().distinct().collect(Collectors.toList()); 这样会删除重复项。