【问题标题】:JAVA Sort String Array Add Missing Numbers [closed]JAVA排序字符串数组添加缺失的数字[关闭]
【发布时间】:2020-12-05 08:26:00
【问题描述】:

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

【问题讨论】:

  • 如果您已经尝试过,请向我们展示您的尝试。如果没有,请删除问题并在您已经尝试并遇到问题时发布。
  • 如何定义元素是否丢失?你能给我们提供更多输入和输出的例子吗?
  • 我想要实现的是一个字符串数组,在这个例子中,包含元素 x1-x9、y1-y9 和 z1-z50。我不知道如何添加缺失的元素并保持字母顺序。我尝试过涉及 .contains() 方法的复杂 for 循环,但这在逻辑上是有缺陷的。

标签: java string sorting numbers add


【解决方案1】:

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

  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]

【讨论】:

    【解决方案2】:

    试试这个。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多