1

我有一个包含以下示例条目(名称和疾病)的数组列表:

1.  Name: Aimee Cholmondeley. Disease: German measles
2.  Name: Colin Anissina.     Disease: Diphtheria
3.  Name: Colin Anissina.     Disease: Malaria
4.  Name: Aimee Cholmondeley. Disease: Typhoid fever
5.  Name: Isaias Cheung.      Disease: Haemophilus Influenza
6.  Name: Isaias Cheung.      Disease: Scarlet fever
7.  Name: Sebastian Cutting.  Disease: Gingivitis
8.  Name: Juan Weiss.         Disease: Acquired Immunodeficiency Sydrome (AIDS)
9.  Name: Kaelyn Nauman.      Disease: Amebiasis
10. Name: Kaelyn Nauman.      Disease: Human Pulmonary Syndrome (HPS)
11. Name: Lyndsey Stapleton.  Disease: Chlamydia
12. Name: Lyndsey Stapleton.  Disease: Chlamydia
  • 相同的名称,不同的疾病-> 删除两者!
  • 一个实例 -> 保留
  • 相同的名字,相同的疾病 -> 保留,但只有一份!

现在,由于某种原因, .equals 不起作用。所以我不能简单地做if (arrayList.get(i).equals(arrayList.get(j)) then remove。所以我单独比较名称和疾病,compareTo用于比较疾病(这是有效的)。

这是我尝试过的:

    for (int i = 0; i < IDArray.size(); i++){ //IDArray contains all the elements
        int countFound = 0;
        IdenPerson curr1 = IDArray.get(i);
        for (int j = i + 1; j < IDArray.size(); j++) {
               IdenPerson curr2 = IDArray.get(j);
               if (curr1.name.toString().equals(curr2.name.toString())) { //If Name is same
                   if  ((curr1.dis.toString().compareTo(curr2.dis.toString())) == 0) { // And Disease is same
                       System.out.println(curr1.name.toString()); // Print that Name
                       break;
                   }
               }
               else {
                   // If name is not same, and only repeated once ... how to do this?
               }
        }
    }
public static class IdenPerson {
    String name;
    String dis;
}

使用上面的方法,我可以找到双副本元素,但我无法分离单个实例元素。请帮忙!我不能使用 Java 外部的库。

以下是上面的 ArrayList 工作时的样子:

1. Name: Sebastian Cutting.  Disease: Gingivitis
2. Name: Juan Weiss.         Disease: Acquired Immunodeficiency Sydrome (AIDS)
3. Name: Lyndsey Stapleton.  Disease: Chlamydia
4

4 回答 4

3

这可以使用Map<String, Set<String>>. 请看一下这种方法。

基本上,我保持着Set<String>控制疾病。如果一个名字有相同的疾病,那么Set应该有一个,如果一个名字有多个,那么Set应该有多个条目

我正在消除Set 具有多个条目的值

public class ArrayListDisease {

    public static List<String> process(List<String> input) {

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

        for(String s : input) {
            String [] nameAndDisease = s.split("\\.");
            if(map.containsKey(nameAndDisease[0])) {
                Set<String> diseases = map.get(nameAndDisease[0]);
                diseases.add(nameAndDisease[1]);
            }
            else {
                Set<String> set = new HashSet<String>();
                set.add(nameAndDisease[1]);
                map.put(nameAndDisease[0], set);
            }
        }

        List<String> res = new ArrayList<String>();
        for(Entry<String, Set<String>> e : map.entrySet()) {
            String key = e.getKey();
            Set<String> values = e.getValue();
            if(values.size() == 1) {
                res.add(key+"."+values.iterator().next());
            }
        }
        return res;
    }


    public static void main(String [] args) {
        List<String> input = new ArrayList<String>();
        input.add("Name: Aimee Cholmondeley. Disease: German measles");
        input.add("Name: Colin Anissina.     Disease: Diphtheria");
        input.add("Name: Colin Anissina.     Disease: Malaria");
        input.add("Name: Aimee Cholmondeley. Disease: Typhoid fever");
        input.add("Name: Isaias Cheung.      Disease: Haemophilus Influenza");
        input.add("Name: Isaias Cheung.      Disease: Scarlet fever");
        input.add("Name: Sebastian Cutting.  Disease: Gingivitis");
        input.add("Name: Juan Weiss.         Disease: Acquired Immunodeficiency Sydrome (AIDS)");
        input.add("Name: Kaelyn Nauman.      Disease: Amebiasis");
        input.add("Name: Kaelyn Nauman.      Disease: Human Pulmonary Syndrome (HPS)");
        input.add("Name: Lyndsey Stapleton.  Disease: Chlamydia");
        input.add("Name: Lyndsey Stapleton.  Disease: Chlamydia");

        System.out.println(process(input));
    }

}

这是输出

[Name: Lyndsey Stapleton.  Disease: Chlamydia, Name: Juan Weiss.         Disease: Acquired Immunodeficiency Sydrome (AIDS), Name: Sebastian Cutting.  Disease: Gingivitis]
于 2013-04-09T06:48:32.627 回答
2

我假设您可以使用其他库,此解决方案基于此。拉入Guava并使用MultiMap

LinkedListMultimap<String, String> mappedPersons = LinkedListMultimap.create();

for (int i = 0; i < IDArray.size(); i++) {
    IdenPerson person = IDArray.get(i);
    mappedPersons.put(person.name, person.dis);
}

List<IdenPerson> uniques = new ArrayList<IdenPerson>(mappedPersons.size());
for(int i = 0 ; i < IDArray.size(); i++) {
    if(mappedPersons.get(IDArray.get(i).name).size() == 1) {
        uniques.add(IDArray.get(i));
    }
}

代码需要清理,并且可以优化,但你明白了要点。

附带说明一下,您绝对应该遵循更好的命名标准,并为您的 Java 对象使用适当的访问器/修改器。

新的旁注:下一次,请说明问题是否与作业或家庭作业有关。从长远来看,在这种情况下提供近乎完整的解决方案对您没有帮助


如果由于任何原因无法引入其他库,则可以通过将多图替换为地图/列表组合以相同的方式完成任务:

Map<String, Set<String>> mappedPersons =
    new HashMap<String, Set<String>>(IDArray.size());

for (int i = 0; i < IDArray.size(); i++) {
    IdenPerson person = IDArray.get(i);
    List<String> diseases = mappedPersons.get(person.name);
    if(diseases == null) {
        diseases = new HashSet<String>(4);
        mappedPersons.put(person.name, diseases);
    }

    diseases.add(person.dis);
}

List<IdenPerson> uniques = new ArrayList<IdenPerson>(mappedPersons.size());
for(int i = 0 ; i < IDArray.size(); i++) {
    if(mappedPersons.get(IDArray.get(i).name).size() == 1) {
        uniques.add(IDArray.get(i));
    }
}
于 2013-04-09T06:36:01.320 回答
1

您可以使用Map<String,IdenPerson>. 当名称和疾病相同时,覆盖 IdenPerson 的 equals() 和 hashCode() 以返回 true。在插入带有 的条目之前put('name',person),请检查带有 的条目get('name')。根据比赛,执行以下操作。

相同的名称,不同的疾病-> 删除两者!

如果它与条目匹配,请检查疾病并在必要时删除条目。equals()如果姓名和疾病相同,则人员匹配将返回 true。

一个实例 -> 保持同名

那也应该很简单。如果该名称存在一个实例,则 get() 将永远找不到密钥。

相同的名字,相同的疾病 -> 保留,但只有一份!

get 将匹配现有条目,但疾病将相同并且equals()将返回 true,因此无需执行任何操作。保留现有条目并继续前进。

于 2013-04-09T06:39:13.367 回答
0

伪代码:

添加found布尔值。将其初始化为false,如果发现重复,请将其设置为true. 然后 - 在循环结束时检查发现是否为假。如果是这样 - 将其添加为唯一名称。

于 2013-04-09T06:38:27.893 回答