JAVA 对字符串数组排序添加缺失数字

JAVA Sort String Array Add Missing Numbers

在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","x3","x5","x9","y1","y3","y6","y9","z14","z17","z22","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, 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]

groupingBy

的中间结果
{x=[1, 3, 5, 9], y=[1, 3, 6, 9], z=[14, 17, 22, 50]}