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值) 将指定的值与此映射中的指定键相关联。如果映射以前包含键的映射,则替换旧值 因此,为了解决您的问题,我向您推荐两种方法:
地图
,这里的关键是名字,列表是每个必须满足您要求的人我想我会在两次传球中完成 在第一个过程中,仅将姓氏非空的记录放入临时映射中。别介意现在重复的名字会丢失 在第二次传递之前,创建一个结果集合,可以是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