我有两个集合,其中键和值都是字符串。我需要订购集合,所以我决定使用" TreeMap"保持订购。
我想:
1)打印出两个集合,' garList'和' noGarList'分别;
2)将第一个集合的每个元素与第二个集合的每个元素进行比较;
3)从第一个集合中删除(' garList')那些出现在第二个集合中的元素(' noGarList')。
我编写了以下代码来完成这3项任务:
public class TryTask_A_copy {
public static void main(String[] args) {
// First collection:
TreeMap<String, String> garList = new TreeMap<>();
// Second collection:
TreeMap<String, String> noGarList = new TreeMap<>();
// Fill the "Properties" obj for 'Gar':
garList.put("Gar_1", "rotura de lunas");
garList.put("Gar_2", "arbitraje de ley");
garList.put("Gar_3", "Adaptación del hogar");
// Fill the "Properties" obj for 'noGar':
noGarList.put("noGar_1", "rotura de lunas");
noGarList.put("noGar_2", "reembolso total");
noGarList.put("noGar_3", "Adaptación del coche");
// Get a set of the entries:
Set garSet = garList.entrySet();
Set noGarSet = noGarList.entrySet();
// Def strings needed for the comparison:
String strGar;
String strNoGar;
// Get an iterator:
Iterator i_gar = garSet.iterator();
Iterator i_noGar = noGarSet.iterator();
// Display 'Gar' elements:
while(i_gar.hasNext()){
String me_Gar = (String)i_gar.next(); // Exception in thread "main" java.lang.ClassCastException: java.util.TreeMap$Entry cannot be cast to java.lang.String
strGar = (String) i_gar.next();
System.out.println(strGar + " : " + garList.get(strGar) + ".");
}
System.out.println();
// Display 'noGar' elements:
while(i_noGar.hasNext()){
String me_noGar = (String)i_noGar.next();
strNoGar = (String) i_noGar.next();
System.out.println(strNoGar + " : " + garList.get(strNoGar) + ".");
}
// Get new iterators:
Iterator itr_gar = garSet.iterator();
Iterator itr_noGar = noGarSet.iterator();
// Compare elements from 'Gar' list with elements from 'noGar' list
// and remove those elements from 'Gar' list that appear in 'noGar' list as well:
while(itr_gar.hasNext()){
strGar = (String) itr_gar.next();
while(itr_noGar.hasNext()){
String str1 = garList.get(strGar);
strNoGar = (String) itr_noGar.next();
String str2 = noGarList.get(strNoGar);
boolean result = str1.equalsIgnoreCase(str2);
System.out.println(strGar + " : " + str1 + ".");
System.out.println(strNoGar + " : " + str2 + ".");
System.out.println(result);
System.out.println();
// if an element appears in both lists, then remove this element from "Gar" list:
if(result != true){
} else {
Object garList_new = garList.remove(strGar);
System.out.println("Removed element: " + garList_new);
System.out.println();
}
}
itr_noGar = noGarSet.iterator();
}
}
}
但我明白了:
线程中的异常&#34; main&#34; java.lang.ClassCastException: java.util.TreeMap $ Entry无法强制转换为java.lang.String&#34;在第51行 (见评论)。
我知道我的两个TreeMap对象的元素是&#34; Map Entry&#34;类型,不能转换为&#34;字符串&#34;类型,这是正确的吗?
但是,如何获得一个有序的集合,其中键和值都是字符串?
写garSet.removeAll(noGarSet)
之类的内容不起作用,因为这意味着键和值重合。但在我的情况下,我有两个集合中的一些值在具有不同的键时重合。
所以我需要一个以下解决方案:有一个有序集合,其中键和值都是字符串,可以比较和删除值。
你可以帮我解决这个问题吗?
答案 0 :(得分:1)
我对你想要实现的目标有点不清楚但如果你想基于键删除那么就是这样做:
garSet.removeAll(noGarSet);
您的代码通常看起来要比您想要实现的代码复杂得多。例如,要打印地图中的所有字符串:
for (Entry<String, String> entry: garMap.entrySet()) {
System.out.println(entry.key() + " : " + entry.value() + ".");
}
如果你这样做:
map1.keySet().removeAll(map2.keySet())
然后将删除所有基于密钥的重复项。
map1.values().removeAll(map2.values())
将根据值删除所有重复项。
map1.entryset().removeAll(map2.entrySet())
将根据键/值对删除所有重复项。