我有一个场景,我需要获取 a 的键Map<String, Set<String>>,并将它们添加到一个新Set<String>的排序中。排序顺序基于每个键的 Map 值。映射的每个键的值是一个包含与该键相关的其他键的 Set。
我需要以这样一种方式对键进行排序,即相关键必须在另一个包含它的相关集中的键之前。要使用编程范式,它类似于要求在更早的行中声明变量,然后才能在另一行上引用它。
例如,以下表示 的内容Map<String, Set<String>>:
abc=[def, ghi, jkl, mno]
def=[]
ghi=[def]
jkl=[ghi, stu]
mno=[]
pqr=[abc]
stu=[def]
vwx=[mno, ghi]
zy0=[jkl]
在这个例子中,键“jkl”与键“ghi”和“stu”有关系,“def”与任何键都没有关系。
注意:关系将是单向的。因此,例如,如果“ghi”与“def”相关,则“def”永远不会与“ghi”相关。
因此,对于上述 Map,排序顺序为:
def=[]
mno=[]
ghi=[def]
stu=[def]
vwx=[mno, ghi]
jkl=[ghi, stu]
zy0=[jkl]
abc=[def, ghi, jkl, mno]
pqr=[abc]
这是我写的比较器。它位于使用上述示例的可运行测试类中:
import java.util.*;
public class RelationshipComparator_Test {
public static void main(String[] args) {
String[] testMap = "abc=[def,ghi,jkl,mno]|def=[]|ghi=[def]|jkl=[ghi,stu]|mno=[]|pqr=[abc]|stu=[def]|vwx=[mno,ghi]|zy0=[jkl]".split("[|]");
Map<String, Set<String>> relationshipMap = new HashMap<>();
for (String entry : testMap) {
String[] keyValue = entry.split("[=]");
String replacement = keyValue[1].replaceAll("[^a-z0-9,]", "");
Set<String> valueSet = new HashSet<>();
String[] values = (!replacement.equals("") ? replacement.split("[,]") : new String[0]);
Collections.addAll(valueSet, values);
relationshipMap.put(keyValue[0], valueSet);
}
Set<String> sortedKeys = new TreeSet<>(new RelationshipComparator(relationshipMap));
sortedKeys.addAll(relationshipMap.keySet());
for (String key : sortedKeys) {
System.out.println(key + "=" + relationshipMap.get(key));
}
}
如果运行代码,您将看到以下输出:
def=[]
mno=[]
ghi=[def]
jkl=[stu, ghi]
abc=[def, ghi, jkl, mno]
pqr=[abc]
stu=[def]
vwx=[ghi, mno]
zy0=[jkl]
这是不正确的,因为“jkl”引用了“stu”,但“stu”排在“jkl”之后。
任何帮助将不胜感激。
相关分类