从Map <key,list <values =“”>&gt;交换密钥

时间:2017-06-30 12:41:13

标签: java dictionary key

我正在寻找这个问题的解决方案(这是一个考试):

我有一张地图&lt; String,SortedSet&lt;字符串&gt; &GT; 运算符由函数填充

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&lt; String,SortedSet&lt;字符串&gt; &GT; 目标,其具有destinationName的关键字和与operatorNames相关的值。

我怎样才能做到这一点?

P.S:这一方面有方法的用法,而非代码中的部分是想要的输出。很抱歉代码格式不正确。 ph是façade模式类的实例

    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]

3 个答案:

答案 0 :(得分:1)

您需要浏览地图中的每个条目,并检查内部集合是否包含您要检查的值,

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;
}

答案 1 :(得分:1)

为了让您的示例输出成为一个简单的单行内容:

override func viewDidLoad() {
        super.viewDidLoad()

        let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
        if launchedBefore  {
            performSegue(withIdentifier: "toMainController", sender: self)
            print("launchedBefore")
        } else {
            UserDefaults.standard.set(true, forKey: "launchedBefore")
            performSegue(withIdentifier: "toTutorialController", sender: self)
            print("not launchedBefore")
        }
    }

或者为了更好的可读性,分布在多行:

List<String> result = operators.entrySet().stream().filter(entry -> entry.getValue().contains(destinationName)).map(Entry::getKey).sorted().collect(Collectors.toList());
如果你想&#34;反向&#34;更复杂的单行班轮您在文中描述的映射:

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())));

答案 2 :(得分:-1)

你需要做的是,遍历每个运算符,然后循环遍历列表中的所有条目,如果列表中的值尚未出现在输出映射中,则添加它,否则修改其运算符的集合。 以下是一些代码:

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);
                });
        });