java - 如何在 Java 中简化印度地区的字符串?(问题扩展)
问题描述
我有一串印度地区。例如String districts = district1,district2,district3,...
等等(可能是印度的全部或部分地区)。
假设,
district1,district2,district3 是拉贾斯坦邦的地区
,而
district4,district5,district6 是古吉拉特邦的地区
我想在其中显示地区变量的
场景是什么,但如果这个字符串包含任何州的所有地区,那么只有州名应该显示在它的所有地区的地方。它将减少字符串的大小,并且看起来会更好。有关详细说明,请参阅基本问题TextView
实现案例 1
输入 = District1,district2,district3,district4
输出 = Rajasthan,district4
实现案例 2
输入 = District1,district2,district3,district4,district5
输出 = Rajasthan,district4,district5
实现案例 2
输入 = District1,district2,district3,district4,district5,district6
输出 = Rajasthan,Gujrat
预期案例 1
输入 = District1,district2,district3,district4
输出 = Rajasthan, Gujrat (district4)
预期案例 2
输入 = District1,district2,district3,district4,district5
输出 = Rajasthan,Gujrat (district4,district5)
预期案例 3
输入 = District1,district2,district3,district4,district5,district6
输出 = Rajasthan,Gujrat
解决方案
扩展我之前的答案,下面给出了如何实现此要求:
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);
}
}
输出:
Rajasthan,Gujrat(Dist4)
Rajasthan,Gujrat
此解决方案的新增功能:
- 如果完整
List<String> temp
的地区集不存在于textViewString
. - 创建一个字符串作为状态+“(”+
temp
逗号连接的字符串+“)”并将其添加到resultList
.temp
像原来的解决方案一样,删除from的所有区districtSetTextView
。
推荐阅读
- c++ - 使用数组的问题
- r - 使用 roll_sum 时的部分总和
- arrays - 在作业中返回 Powershell 数组
- c# - 从 DataContext 中删除一个项目并在没有 SaveChanges() 的情况下显示更新的值
- chef-infra - 在 Ubuntu 18.04 上通过 chef-solo 安装 apache2 失败
- selenium - 如何通过 Facebook/php-webdriver 添加选项?
- oracle-sqldeveloper - Oracle SQL - 从 CSV(Excel 格式)导入日期
- ios - 根据元数据更改 AVPlayerViewController 的显示文本
- typescript - 扩展运算符是否在操作后返回新对象?
- javascript - 复制图像 URL 并粘贴到单独页面的表单中