问题描述
在Java中,我有一个字符串数组。它包含具有不同数字的字符串。例如:x1,x3,x5,x9,y1,y3,y6,y9,z14,z17,z22,z50。如何按字母和数字对数组进行排序,并按顺序添加缺少的字符串元素(x2 ...)?
解决方法
执行此操作的简单方法如下:
- 对数组进行排序。
- 获取每个字母的最小和最大数量并将其保存在单独的地图中。
- 对于每个字母,请从指定的保存范围添加到列表中。
这是解决方案:
public static void main(String[] args) {
String[] arr = new String[] {"x1","x3","x5","x9","y1","y3","y6","y9","z14","z17","z22","z50"};
System.out.println(Arrays.toString(addMissing(arr)));
}
private static String[] addMissing(String[] arr) {
Arrays.sort(arr);
Map<String,Integer> min = new HashMap<>();
Map<String,Integer> max = new HashMap<>();
for(int i = 0; i < arr.length; i++) {
String str = arr[i];
int number = getNum(str);
String letter = getChar(str);
if(min.containsKey(letter)) {
if(min.get(letter) > number)
min.put(letter,number);
}else {
min.put(letter,number);
}
if(max.containsKey(letter)) {
if(max.get(letter) < number)
max.put(letter,number);
}else {
max.put(letter,number);
}
}
List<String> list = new ArrayList<>();
for(String key : min.keySet()) {
int minNumber = min.get(key),maxNumber = max.get(key);
for(int i = minNumber; i <= maxNumber; i++)
list.add(key+i);
}
String[] res = new String[list.size()];
for(int i = 0; i < list.size(); i++) res[i] = list.get(i);
return res;
}
private static String getChar(String str) {
return str.replaceAll("\\d","");
}
private static int getNum(String str) {
return Integer.parseInt(str.replaceAll("\\D+",""));
}
输出:
[x1,x2,x3,x4,x5,x6,x7,x8,x9,y1,y2,y3,y4,y5,y6,y7,y8,y9,z14,z15,z16,z17,z18,z19,z20,z21,z22,z23,z24,z25,z26,z27,z28,z29,z30,z31,z32,z33,z34,z35,z36,z37,z38,z39,z40,z41,z42,z43,z44,z45,z46,z47,z48,z49,z50]
,
尝试一下。
String[] arr = new String[] {"x1","z50"};
List<String> result = Arrays.stream(arr)
.collect(Collectors.groupingBy(s -> s.substring(0,1),Collectors.mapping(s -> Integer.parseInt(s.substring(1)),Collectors.toList())))
.entrySet().stream()
.flatMap(e -> IntStream.rangeClosed(
e.getValue().stream().mapToInt(Integer::intValue).min().getAsInt(),e.getValue().stream().mapToInt(Integer::intValue).max().getAsInt())
.mapToObj(i -> e.getKey() + i))
.sorted()
.collect(Collectors.toList());
System.out.println(result);
输出
[x1,z50]
groupingBy
的中间结果
{x=[1,3,5,9],y=[1,6,z=[14,17,22,50]}