首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎样才能把信纳入其中呢?

我怎样才能把信纳入其中呢?
EN

Stack Overflow用户
提问于 2019-11-27 07:48:00
回答 2查看 103关注 0票数 0

字符串input=“4,8,222,77,77A”;

我对values.for示例进行了排序,在3-6范围内对3,4,5,6个连续的值进行了排序。我以这种格式对连续的数字"[]“进行了排序,但我无法制作字母。排序列表不应中断。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-27 10:23:15

下面是最后合并字母的示例方法:

代码语言:javascript
运行
复制
static List<String> mergeLetters(List<String> items){
    Map<String, List<String>> mergingCandidates = new HashMap<>();
    for (String s : items) {
        int length = s.length();
        if (length > 1 && Character.isLetter(s.charAt(length - 1))) {
            String key = s.substring(0, length - 1);
            String value = s.substring(length - 1);
            List<String> tmp = mergingCandidates.computeIfAbsent(key, k -> new LinkedList<String>());
            tmp.add(value);
        }
    }

    for (Map.Entry<String, List<String>> entry : mergingCandidates.entrySet()) {
        String key = entry.getKey();
        List<String> characterList = entry.getValue();
        if (characterList.size() > 1) {
            boolean consecutive = true;
            Character[] characters = characterList.stream().map(s -> s.charAt(0)).toArray(Character[]::new);
            for (int i = 0; i < characters.length - 1; i++) {
                if (characters[i + 1] - characters[i] != 1) {
                    consecutive = false;
                    break;
                }
            }
            if (consecutive) {
                int indexToBeReplaced = items.indexOf(key + characterList.get(0));
                String newValue = key + "[" + characterList.get(0)
                        + "-" + characterList.get(characterList.size() - 1) + "]";
                characterList.forEach(letter -> items.remove(key + letter));
                items.add(indexToBeReplaced, newValue);
            }
        }
    }
    return items;
}

解释:

consecutive.

  • If

  • 您可以找到所有仅在最后一个字母上有差异的序列,并从中生成一个地图。

  • 可以选择有两个或更多结尾字母的地图条目。

  • 检查这些字母是否为“是”,删除它们,然后添加一个新的合并条目。请小心在同一索引处添加新条目。

main方法应该对项进行排序,首先像现在正确地合并数字,然后替换可以合并的字母:

代码语言:javascript
运行
复制
String input = "605,2A,401-2A,32C,21F,201A,605A,401-1A,200-2E,462A,462,583-58D,200,462-1A,583/58E,583-57D, 542,2B, 1, 542/2E, 801, 802, 803, 605B, 32D, 3, 603, 4, 6, 5, 60, 201C, 542/2D,40,20,2C,800,800-1,50,200-2C,21C,800A,200A,571-573L,51/2,470/1,51/1,571-573K,454-1,444-446,571-573M";
List<String> items = Arrays.asList(input.split("\\s*,\\s*"));
items.sort(Comparator.naturalOrder());
items.sort(Comparator.comparingInt(o -> Integer.parseInt(o.split("\\D")[0])));
List<String> merged = mergeRanges(items);
List<String> mergeLetters = mergeLetters(merged);
System.out.println(("Result: " + mergeLetters));

输入的输出是:

代码语言:javascript
运行
复制
Result: [1, 2[A-C], [3-6], 20, 21C, 21F, 32[C-D], 40, 50, 51/1, 51/2, 60, 200, 200-2C, 200-2E, 200A, 201A, 201C, 401-1A, 401-2A, 444-446, 454-1, 462, 462-1A, 462A, 470/1, 542, 542/2[D-E], 571-573[K-M], 583-57D, 583-58D, 583/58E, 603, 605, 605[A-B], 800, 800-1, 800A, [801-803]]
票数 0
EN

Stack Overflow用户

发布于 2019-11-27 08:07:25

一般思想是首先展开输入中的所有声明,然后对它们进行排序,然后再次发出它们,而当您遇到连续的项时,则压缩范围。

  1. 展开所有声明:571-573 K(如果我正确理解)将扩展到571 k、572 K、573 K三项。大多数简单的声明只是扩展到themselves.
  2. Sort:,您需要一个对数字和字母都敏感的排序函数。它可能需要拆分输入字符串并对数字部分进行数字压缩,但字母部分alphabetically.
  3. Emit:遍历排序列表并发出每个项;但是,如果下一个项与当前项相邻,则将其与当前项合并。这可能需要您创建一个临时输出列表,并将实际输出延迟到您已经完成原始列表之后。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59065407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档