我正在寻找这个问题的解决方案(这是一个考试):
我有一张地图< String,SortedSet<字符串> > 运算符由函数填充
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]
答案 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);
});
});