JAVA排序字符串数组添加缺少的数字

问题描述

在Java中,我有一个字符串数组。它包含具有不同数字的字符串。例如:x1,x3,x5,x9,y1,y3,y6,y9,z14,z17,z22,z50。如何按字母和数字对数组进行排序,并按顺序添加缺少的字符串元素(x2 ...)?

解决方法

执行此操作的简单方法如下:

  1. 对数组进行排序。
  2. 获取每个字母的最小和最大数量并将其保存在单独的地图中。
  3. 对于每个字母,请从指定的保存范围添加到列表中。

这是解决方案:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...