字符串输入=“ 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“;
输出:1 2 [A-C] [3-6] 20 21C 21F 32 [C-D] 40 50 51/1 51/2 60200200-2C 200-2E 200A 201A 201C 401-1A 401-2A 444-446 454-1 462 462-1A462A 470/1 542 542/2 [D-E] 571-573 [K-M] 583-57D 583-58 [D-E] 603605605 [A-B] 800 800-1 800A [801-803]。
我如何将连续的字母包含在范围内?问题是关于将连续的值合并到范围内。例如。 4,5,6是连续值,所以范围是[4-6],而2A,2B,2C是连续值,所以范围是2 [A-C]。其他值不能在范围内。
300A,301B,302C = [300-302] [A-C]否。这必须进行排序。因为它不是串行的。
51/1 51/2 =>未合并。
51 / 1A,51 / 1B,51 / 1C => 51/1 [A-C]
一般模式:
数字[字符] [A-Za-z]
number必须是连续的才能有一个序列。如果有char,则它们必须是equals()才能在一个序列中。如果有尾随字母,则它们必须是连续的才能有一个序列。然后缩写为:first +“-” + last。其中first是序列中的第一个值,last是序列中的最后一个值。
{
public static void main(String[] args) {
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,800,800-1,50,200-2C,21C,800A,200A,571-573B,51/2,470/1,51/1,571-573C,454-1,444-446";
List<String> items = Arrays.asList(input.split("\\s*,\\s*"));
System.out.println("items: " + items);
Collections.sort(items, new Comparator<String>() {
public int compare(String o1, String o2) {
if(extractInt(o1)!=null && extractInt(o2)!=null){
if(extractInt(o1).equals(extractInt(o2)))
{
return o1.substring(extractInt(o1).toString().length())
.compareTo(o2.substring(extractInt(o2).toString().length()));
}
return extractInt(o1).compareTo(extractInt(o2));
}
else if(extractInt(o1)!=null)
{
return -1;
}
else if(extractInt(o2)!=null)
{
return 1;
}
else{
return o1.compareTo(o2);
}}
Integer extractInt(String s) {
Pattern pattern = Pattern.compile("^\\d+");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
String num = matcher.group(0);
return Integer.parseInt(num);
}
return null;
}
});
List<String> merged = mergeRanges(items);
System.out.println("Sorted: " + items);
System.out.println("merged:" + merged);
write(merged);}
public static void write(Collection c) {
Iterator iterator = c.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());}
}
private static List<String> mergeRanges(List<String> items) {
List<String> merged = new ArrayList<>();
int startNum = Integer.MIN_VALUE;
int lastNum = Integer.MIN_VALUE;
boolean inRange = false;
for (String s : items) {
if (isInteger(s)) {
int currentNum = Integer.parseInt(s);
if (!inRange) {
inRange = true;
startNum = currentNum;
lastNum = currentNum;
} else if (currentNum == lastNum + 1) {
lastNum = currentNum;
} else {
addRange(merged, startNum, lastNum);
startNum = currentNum;
lastNum = currentNum; }
} else {
if (inRange) {
addRange(merged, startNum, lastNum);
inRange = false; }
merged.add(s); }}
if (inRange) {
addRange(merged, startNum, lastNum);
}
return merged;}
private static boolean isInteger(String strlist) {
return strlist.matches("\\d+");}
private static void addRange(List<String> merged, int startNum, int lastNum) {
if (lastNum - startNum >= 2) {
merged.add("[" + startNum + "-" + lastNum + "]");
} else {
for (int i = startNum; i <=lastNum; i++) {
merged.add(Integer.toString(i));
}}}}
我的代码putput:
1 2A 2B [3-6] 20 21C 21F 32C 32D 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/2D 542/2E 571-573B 571-573C 583-57D 583-58D 583/58E 603 605 605A 605B 800 800-1 800A [801-803].
我对值进行了排序。例如,我对[3-6]范围内的3,4,5,6个连续值进行了排序。我已经以这种格式完成了连续数字“ []”,但我无法将字母拼成。排序的列表不应被破坏。
next项与当前项相邻,则将其与当前项合并。这可能需要您创建一个临时输出列表,并将实际输出延迟到您遍历原始列表为止。