Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据条件从列表中删除元素_Java_Algorithm_Arraylist_Hashmap_Filtering - Fatal编程技术网

Java 根据条件从列表中删除元素

Java 根据条件从列表中删除元素,java,algorithm,arraylist,hashmap,filtering,Java,Algorithm,Arraylist,Hashmap,Filtering,我有一个代码,可以选择性地向地图添加数据,如下所示 public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("Johnny", "Depp", 18), new Person("Jennifer", null, 30), new Person("Ang

我有一个代码,可以选择性地向地图添加数据,如下所示

public static void main(String[] args) {

        List<Person> people = Arrays.asList(
                new Person("Johnny", "Depp", 18),
                new Person("Jennifer", null, 30),
                new Person("Angelina", null, 23),
                new Person("Angelina", "Garlic", 38),
                new Person("Angelina", "Jolie", 40),
        );

        Map<String, Person> map = new HashMap<>();

        for (Person person:
             people) {
            Person temp = map.get(person.getFirstName());
            if(temp == null || temp.getLastName() == null)
                map.put(person.getFirstName(), person);
        }

        for (Map.Entry mapper:
             map.entrySet()) {
            Person temp = (Person) mapper.getValue();
            System.out.println(temp.getFirstName());
            System.out.println(temp.getLastName());
            System.out.println();
        }

    }
现在,我需要检查以下条件, 1) 地图上有多条同名记录;如果记录的姓氏为null,则应将该记录添加到映射中。 2) 如果地图上只记录了一个人的名字;如果该记录的姓氏为null,则它符合添加到映射的条件

因此,我当前解决方案的输出是,

约翰尼 德普

珍妮弗 空的

安吉丽娜 大蒜

我需要的输出应该在哪里,

约翰尼 德普

珍妮弗 空的

安吉丽娜 大蒜

安吉丽娜 朱莉


注意:我正在使用Java 7(不,Java 8不是一个选项)

这是因为,在地图中,密钥必须是唯一的,所以当您第二次检查Angelina时,它匹配,因为姓氏为
null
,并且您将其放入地图时,您覆盖了原始Angelina。必须有唯一的钥匙

公共接口图 将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值

我找到了两种不同的解决方法 1。使用补充列表维护将覆盖当前关键帧的对象

List<Person> supplementaryList = new ArrayList<Person>();

Map<String, Person> map = new HashMap<String, Person>();

for (Person person : people) {

  Person temp = map.get(person.getFirstName());

  if (temp != null) {
    supplementaryList.add(person);
    if (temp.getLastName() == null)
      map.remove(temp.getFirstName());

  } else {
    map.put(person.getFirstName(), person);
  }
}

for (Map.Entry mapper : map.entrySet()) {
  Person temp = (Person) mapper.getValue();
  System.out.println(temp.getFirstName());
  System.out.println(temp.getLastName());
  System.out.println();
}

for (Person p : supplementaryList) {

  System.out.println(p.getFirstName() + p.getLastName());

}

HashMap不允许重复的键(名字),所以你不能在地图上看到安吉丽娜·朱莉。 来自java HashMap的文档

公共V put(K键, (V值) 将指定的值与此映射中的指定键相关联。如果映射以前包含键的映射,则替换旧值

因此,为了解决您的问题,我向您推荐两种方法:

  • 制作一张
    地图
    ,这里的关键是名字,列表是每个必须满足您要求的人

  • 使用支持多键的实现,如Apache Commons集合的Multimap或Guava


  • 我想我会在两次传球中完成

    在第一个过程中,仅将姓氏非空的记录放入临时映射中。别介意现在重复的名字会丢失

    在第二次传递之前,创建一个结果集合,可以是set,也可以是list。地图不行。在第二步中,对于每个lastname为null的记录,您可以在映射中检查是否存在具有相同名字和非null姓氏的记录。现在您知道哪些记录应该进入您的结果


    用一组名字代替临时映射就足够了。

    我认为第一种方法需要很多条件,特别是在检查映射中是否没有键时,然后创建一个新的arraylist,然后将其添加到与键关联的映射中。虽然,我在考虑第二种方法,但我以前从未使用过多重贴图,如果你能对它有所了解的话(这对我真的很有帮助)。另外,如果你可以建议一种替代方法,并且在allI不使用地图,我想你的意思是,如果有多个记录的名字是samme,而有一个记录的姓氏为空,那么就不应该添加它?我不理解这个问题的标题。它与根据条件从列表中删除元素有什么关系?是的,我之前尝试过这种方法,但发现设计不太优雅,因为它使用了两种数据结构,然后分别循环使用它们。虽然我想不出任何其他方法,但感谢您的解决方案!投赞成票@PewDiePie我添加了下面提到的
    Map
    实现方式。谢谢你的投票,祝你好运!
    List<Person> supplementaryList = new ArrayList<Person>();
    
    Map<String, Person> map = new HashMap<String, Person>();
    
    for (Person person : people) {
    
      Person temp = map.get(person.getFirstName());
    
      if (temp != null) {
        supplementaryList.add(person);
        if (temp.getLastName() == null)
          map.remove(temp.getFirstName());
    
      } else {
        map.put(person.getFirstName(), person);
      }
    }
    
    for (Map.Entry mapper : map.entrySet()) {
      Person temp = (Person) mapper.getValue();
      System.out.println(temp.getFirstName());
      System.out.println(temp.getLastName());
      System.out.println();
    }
    
    for (Person p : supplementaryList) {
    
      System.out.println(p.getFirstName() + p.getLastName());
    
    }
    
    Map<String, List<Person>> namesMap = new HashMap<String, List<Person>>();
    
    for (Person p : people) {
    
      List<Person> res = namesMap.get(p.getFirstName());
    
      // if there is not valid list of names for key add new person
      if (res == null) {
        List<Person> newListOfPeople = new ArrayList<Person>();
        newListOfPeople.add(p);
        namesMap.put(p.getFirstName(), newListOfPeople);
      } else {
    
        if (p.getLastName() != null) {
          res.add(p);
          namesMap.put(p.getFirstName(), res);
          Iterator<Person> iter = res.iterator();
          // remove null from list if it exists
          while (iter.hasNext()) {
            Person person = iter.next();
            if (person.getLastName() == null)
              iter.remove();
          }
        }
      }
    }
    
    for (Map.Entry<String, List<Person>> kv : namesMap.entrySet()) {
      if (kv.getValue() != null) {
        for (Person p : kv.getValue())
          System.out.println(p.getFirstName() + " " + p.getLastName());
    
      }
    }
    
    Johnny Depp
    Jennifer null
    Angelina Garlic
    Angelina Jolie