如何比较 2 个地图的值 Java
How to compare the values of 2 Maps Java
在高层次上,我正在尝试比较 2 个字符串映射的值
Map 1: [{ExpID1, SomeExpValue1}, {ExpID2, SomeExpValue2}, ...]
Map 2: [{FriID1, SomeFriValue1}, {FriID1, SomeFriValue2}, ...]
所以最终,我希望我的比较是这样的:
Sudo 代码:
if ( ExpID1.equals(FriID1) ) {
Assert.AssertEquals(SomeExpValue1, SomeFriValue1, "Library element does not match!")
}
但是,由于这些是地图,因此需要一些循环。我真正的问题在这里,我怎样才能正确有效地循环而没有更多的嵌入式 foreach 或 forloops。这些似乎超级昂贵。我觉得我当前的循环在某种程度上是错误的或不必要的昂贵。任何帮助或协助将不胜感激。
目前我拥有的是:
@Test
public void testIntegration() throws Exception {
// Get all files in directory
File[] files = getFilesInFolder(friendlyNamesDir);
String linkedResp = FileUtils.readFileToString(new File(explanationResponsePath));
Map<String, String> map1 = getIDTitleMapExpResponse(linkedResp, "node");
int counter = 1;
for(File f : files) {
if(f.length() == 0) throw new Exception("File does not exist...");
for(String expID : map1.keySet()) {
logger.info("Exp ID: "+expID);
Map<String, String> map2 = getIDNameMapFromFriendly(f.getCanonicalPath());
for(String friendlyID : map2.keySet()) {
logger.info(counter+" - Friendly ID: "+friendlyID+" Name: "+map2.get(friendlyID));
if(friendlyID.equals(expID)) {
Assert.assertEquals(map1.get(friendlyID), map2.get(expID));
}
counter++;
}
}
}
}
根据 Java 文档:
https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#equals-java.lang.Object-
您可以直接比较地图,它会确保检查地图中的元素是否相等。
我了解映射不一定相等,但必须包含相等键的相等值。因此:
boolean alleq = true;
Set<String> key1 = new HashSet<>( map1.keySet() );
key1.retainAll( map2.keySet();
for( String s: key1 ) ){
if( ! map1.get(s).equals( map2.get(s) ) ){
alleq = false;
break;
}
}
您还可以迭代一个键集并测试该键在另一组中是否存在;无需重复第二组。
boolean alleq = true;
for( String key1: map1.keySet() ){
String value2 = map2.get( key1 );
if( value2 != null && ! value2.equals( map1.get(key1) ) ){
alleq = false;
break;
}
}
在高层次上,我正在尝试比较 2 个字符串映射的值
Map 1: [{ExpID1, SomeExpValue1}, {ExpID2, SomeExpValue2}, ...]
Map 2: [{FriID1, SomeFriValue1}, {FriID1, SomeFriValue2}, ...]
所以最终,我希望我的比较是这样的:
Sudo 代码:
if ( ExpID1.equals(FriID1) ) {
Assert.AssertEquals(SomeExpValue1, SomeFriValue1, "Library element does not match!")
}
但是,由于这些是地图,因此需要一些循环。我真正的问题在这里,我怎样才能正确有效地循环而没有更多的嵌入式 foreach 或 forloops。这些似乎超级昂贵。我觉得我当前的循环在某种程度上是错误的或不必要的昂贵。任何帮助或协助将不胜感激。
目前我拥有的是:
@Test
public void testIntegration() throws Exception {
// Get all files in directory
File[] files = getFilesInFolder(friendlyNamesDir);
String linkedResp = FileUtils.readFileToString(new File(explanationResponsePath));
Map<String, String> map1 = getIDTitleMapExpResponse(linkedResp, "node");
int counter = 1;
for(File f : files) {
if(f.length() == 0) throw new Exception("File does not exist...");
for(String expID : map1.keySet()) {
logger.info("Exp ID: "+expID);
Map<String, String> map2 = getIDNameMapFromFriendly(f.getCanonicalPath());
for(String friendlyID : map2.keySet()) {
logger.info(counter+" - Friendly ID: "+friendlyID+" Name: "+map2.get(friendlyID));
if(friendlyID.equals(expID)) {
Assert.assertEquals(map1.get(friendlyID), map2.get(expID));
}
counter++;
}
}
}
}
根据 Java 文档:
https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#equals-java.lang.Object-
您可以直接比较地图,它会确保检查地图中的元素是否相等。
我了解映射不一定相等,但必须包含相等键的相等值。因此:
boolean alleq = true;
Set<String> key1 = new HashSet<>( map1.keySet() );
key1.retainAll( map2.keySet();
for( String s: key1 ) ){
if( ! map1.get(s).equals( map2.get(s) ) ){
alleq = false;
break;
}
}
您还可以迭代一个键集并测试该键在另一组中是否存在;无需重复第二组。
boolean alleq = true;
for( String key1: map1.keySet() ){
String value2 = map2.get( key1 );
if( value2 != null && ! value2.equals( map1.get(key1) ) ){
alleq = false;
break;
}
}