为了账号安全,请及时绑定邮箱和手机立即绑定

使用映射值的 Java 比较器排序问题

使用映射值的 Java 比较器排序问题

HUWWW 2021-10-20 14:54:04
我有一个场景,我需要获取 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”之后。任何帮助将不胜感激。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信