如果元素的键是重复的,如何从列表中删除元素但是值必须附加到java中的单个键?

时间:2016-05-03 06:40:50

标签: java

我有清单,

但是,我想做的是, 在列表中,密钥是重复的,因此我必须删除该记录,但该值应附加到单个密钥

我的方法:

ArrayList<Students> students = new ArrayList<Students>();
student = getDetails();
    for(int i=0;i<students.size();i++)
     {
       for(int j=i+1;j<students.size();j++)
        {
           if(students.get(i).getName().equals(students.get(j).getName()))
             {
                string name=students.get(j).getName();
                students.set(i).setName(students.get(i).getName()+","+name"");
                students.remove(j);
             }
        }
     }

这里我只能将索引1的值附加到索引0 ..循环正在下一次迭代。

Input:
Name=Student1   Id=1000, 
Name=Student1   Id=1003, 
Name=Student1   Id=1004,


Expected output:
Name=Student1   Id=1000, 1003,1004

Actual getting output:
Name=student1 Id=1000,1003
Name=student1 Id=1004

2 个答案:

答案 0 :(得分:3)

您正尝试将值(Student)分配给键(Name),其中给定键可以有多个值。您应该使用Multimap结构而不是数组(参见Oracle documentation)。

可以使用Java 8 Streams自动完成:

    Student s1 = new Student("Student1", 1000);
    Student s2 = new Student("Student1", 1003);
    Student s3 = new Student("Student1", 1004);
    List<Student> l = Arrays.asList(s1,s2,s3); 
    Map<String, List<Student>> z = l.stream().collect(Collectors.groupingBy(Student::getName));
    System.out.println(z);

输出符合预期:     {Student1 = [Id = 1000,Id = 1003,Id = 1004]}

要获得此结果,我必须覆盖toString()的{​​{1}}方法才能打印Student。我希望它有所帮助。

答案 1 :(得分:0)

您问题中的代码不会产生您所说的输出,以下代码会生成预期的输出。

Student1 1000,1002,1003

输出:

{{1}}