簡體   English   中英

從地圖交換密鑰 <Key, List<Values> &gt;

[英]Swapping key from a Map<Key, List<Values>>

我正在尋找此問題的解決方案(用於考試):

我有一個由函數填充的Map <String,SortedSet <String>> 運算符

public void addOperator(String operatorName, String... destinationNames) throws ProposalException {
    if(operators.containsKey((operatorName))){
        throw new ProposalException("Operator " + operatorName + "already into system!");
    }
    else{
        SortedSet<String> destinationstemp=new TreeSet<>();
        for(String s: destinationNames){
            if(s!=null){
                destinationstemp.add(s);
            }
        }
        operators.put(operatorName, destinationstemp);


    }

現在,我想創建一個新的Map <String,SortedSet <String>> 目標 ,該目標具有destinationName作為關鍵字和與operatorNames相關的值。

我怎樣才能做到這一點?

PS:這是方法的用法,非代碼部分是所需的輸出。 對不起,代碼格式錯誤。 ph是外觀模式類的實例

    public SortedSet<String> getDestOperators(String destinationName) {...}//method that returns the **destinations** values related to destinationName}
ph.addOperator("op3","london","rome");
 ph.addOperator("op2","london","berlin");
 ph.addOperator("op5","berlin","rome","madrid");
ph.addOperator("op1","london","madrid","berlin");
 ph.addOperator("op10","rome");
 ph.addOperator("op4","madrid","berlin"); 
 System.out.println(ph.getDestOperators("madrid"));

輸出:[op1,op4,op5]

您需要遍歷地圖中的每個條目,並檢查內部集合是否包含您要檢查的值,

public SortedSet<String> getDestOperators(String destinationName) {
   Set<String> result = new HashSet<String>();
   for(Map.Entry<String,Set<String>> entry : operators.getValues()){

      if(entry.getValue().contains(destinationName)){
          results.add(entry.getKey());
      }
   }

  return result;
}

為了使示例輸出一個簡單的帶有流的單線:

List<String> result = operators.entrySet().stream().filter(entry -> entry.getValue().contains(destinationName)).map(Entry::getKey).sorted().collect(Collectors.toList());

或為了提高可讀性而在此處分散在多行上:

List<String> result = operators
      .entrySet()
      .stream()
      .filter(entry -> entry.getValue().contains(destinationName))
      .map(Entry::getKey)
      .sorted()
      .collect(Collectors.toList());

如果要按文本中的描述“反轉”映射,則使用更復雜的單行代碼:

Map<String, List<String>> result = operators.entrySet().stream().flatMap(entry -> entry.getValue().stream().collect(Collectors.toMap(Function.identity(), o -> Arrays.asList(entry.getKey()))).entrySet().stream()).collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> Stream.of(a, b).flatMap(List::stream).sorted().collect(Collectors.toList())));

或為了提高可讀性而在此處分散在多行上:

Map<String, List<String>> result2 = operators
      .entrySet()
      .stream()
      .flatMap(entry -> entry
            .getValue()
            .stream()
            .collect(Collectors.toMap(Function.identity(),
                                      o -> Arrays.asList(entry.getKey())))
            .entrySet()
            .stream())
      .collect(Collectors.toMap(Entry::getKey,
                                Entry::getValue,
                                (a, b) -> Stream.of(a, b)
                                      .flatMap(List::stream)
                                      .sorted()
                                      .collect(Collectors.toList())));

您需要做的是,遍歷每個運算符,然后遍歷列表中的所有條目,如果輸出映射中還沒有列表中的值,則添加它,否則修改其運算符集合。 這是一些適合您的代碼:

origin.forEach((key, list) -> {list.forEach(city -> {
            if(result.containsKey(city))
                result.get(city).add(key);
            else{
                SortedSet<String> set = new TreeSet<>();
                set.add(key);
                result.put(city, set);
                });
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM