字符串input=“4,8,222,77,77A”;
我对values.for示例进行了排序,在3-6范围内对3,4,5,6个连续的值进行了排序。我以这种格式对连续的数字"[]“进行了排序,但我无法制作字母。排序列表不应中断。
发布于 2019-11-27 10:23:15
下面是最后合并字母的示例方法:
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.
main方法应该对项进行排序,首先像现在正确地合并数字,然后替换可以合并的字母:
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));
输入的输出是:
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]]
发布于 2019-11-27 08:07:25
一般思想是首先展开输入中的所有声明,然后对它们进行排序,然后再次发出它们,而当您遇到连续的项时,则压缩范围。
https://stackoverflow.com/questions/59065407
复制相似问题