延伸至我之前的回答 https://stackoverflow.com/questions/65952176/how-simplify-string-of-indian-districts-in-java/65952389#65952389,下面给出了如何实现此要求:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Set<String> districtSetRajasthan = new HashSet<>();
districtSetRajasthan.add("Dist1");
districtSetRajasthan.add("Dist2");
districtSetRajasthan.add("Dist3");
Set<String> districtSetGujrat = new HashSet<>();
districtSetGujrat.add("Dist4");
districtSetGujrat.add("Dist5");
Map<String, Set<String>> mapStates = new LinkedHashMap<String, Set<String>>();
mapStates.put("Rajasthan", districtSetRajasthan);
mapStates.put("Gujrat", districtSetGujrat);
// Tests
String textViewString = "Dist1,Dist2,Dist3,Dist4";
System.out.println(getStateDistString(textViewString, mapStates));
textViewString = "Dist1,Dist2,Dist3,Dist4,Dist5";
System.out.println(getStateDistString(textViewString, mapStates));
}
static String getStateDistString(String districts, Map<String, Set<String>> mapStates) {
// Split districts on comma and put the elements of the resultListing array into
// a HashSet
Set<String> districtSetTextView = Arrays.stream(districts.split(",")).collect(Collectors.toSet());
List<String> resultList = new ArrayList<>();
for (String state : mapStates.keySet()) {
Set<String> allDistrictsOfState = mapStates.get(state);
if (districtSetTextView.containsAll(allDistrictsOfState)) {
resultList.add(state);
districtSetTextView.removeAll(allDistrictsOfState);
} else {
List<String> temp = new ArrayList<>();
for (String dist : districtSetTextView) {
if (allDistrictsOfState.contains(dist)) {
temp.add(dist);
}
}
if (temp.size() > 0) {
String x = state + "(" + String.join(",", temp) + ")";
resultList.add(x);
districtSetTextView.removeAll(temp);
}
}
}
return String.join(",", resultList);
}
}
Output:
Rajasthan,Gujrat(Dist4)
Rajasthan,Gujrat
该解决方案的新增内容:
- 创建一个临时的
List<String> temp
如果不存在完整的地区集,则存储州的地区textViewString
.
- 创建一个字符串为 state + "(" + strings of
temp
用逗号+“)”连接并将其添加到resultList
。和原来的解决方案一样,删除所有分区temp
from districtSetTextView
.