猿问

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

我有一个场景,我需要获取 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”之后。


任何帮助将不胜感激。


HUWWW
浏览 133回答 1
1回答
随时随地看视频慕课网APP

相关分类

Java
我要回答