如何将连续的字母包含在范围内?

问题描述 投票:0回答:1

字符串输入=“ 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个连续值进行了排序。我已经以这种格式完成了连续数字“ []”,但我无法将字母拼成。排序的列表不应被破坏。

java parsing comparator
1个回答
0
投票
一般的想法是首先扩展输入中的所有声明,然后对其进行排序,然后再次发出它们,同时在遇到连续项时压缩范围。

  1. 展开所有声明:571-573K(如果我理解正确的话)将扩展为三个项目571K,572K,573K。大多数简单的声明只是扩展自身。
  2. 排序:您需要同时对数字和字母敏感的排序功能。它可能必须分解输入字符串,并在数字上包含数字部分,而在字母上​​包含字母部分。
  3. Emit:遍历排序列表并发出每个项目;但是,如果

    next项与当前项相邻,则将其与当前项合并。这可能需要您创建一个临时输出列表,并将实际输出延迟到您遍历原始列表为止。

© www.soinside.com 2019 - 2024. All rights reserved.