我有一个包含以下样本条目的数组列表(名称和疾病):
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
答案 0 :(得分: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]
答案 1 :(得分: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));
}
}
答案 2 :(得分:1)
您可以使用Map<String,IdenPerson>
轻松完成此操作。当名称和疾病相同时,覆盖IdenPerson的equals()和hashCode()以返回true。在使用put('name',person)
插入条目之前,请检查get('name')
条目。根据匹配情况,执行以下操作。
相同名称,不同疾病 - &gt;删除两个!
如果与条目匹配,请检查疾病并在必要时删除该条目。如果姓名和疾病相同,则人equals()
匹配将返回true。
一个实例 - &gt;保持同名
这应该也很简单。如果名称有一个实例,则get()将无法找到该键。
同名,相同疾病 - &gt;保持,但只有一个副本!
get将匹配现有条目,但疾病将相同,equals()
将返回true,因此不需要采取任何措施。保留现有条目并继续。
答案 3 :(得分:0)
Pseodo代码:
添加found
布尔值。将其初始化为false
,如果发现重复,请将其设置为true
。
然后 - 在循环结束时检查是否为false。如果是这样 - 将其添加为唯一名称。