Java解析包含整数和多个分隔符的String

时间:2017-06-05 01:04:47

标签: java

这是一个示例String,它包含2个用于将String解析为整数的分隔符:

"1,25,3-6,14,16-19"

必须解析上述字符串中的整数并将其添加到ArrayList中包含整数。所以ArrayList必须包含:

1,3,4,5,6,14,16,17,18,19,25

原始字符串中的值永远不会被提及两次。所以,没有过路段。下面你可以看到我到目前为止写的不完整的代码,但我认为我的方向完全错误,并且应该有一种更简单的方法来解决解析。

List<Integer> temp = new ArrayList<>();
Scanner s = new Scanner(System.in);
String str = s.nextLine();
char[] strCh = str.toCharArray();
for (int j = 0; j < strCh.length; j++) {
    char c = strCh[j];
    String number = "";
    char operator = 'n';
    if (Character.isDigit(c)) {
        do {
            number += c;
            j++;
            if (j != strCh.length - 1)
                c = strCh[j];
           } while (j < strCh.length && Character.isDigit(c));
    } else if (c == ',') {
        operator = ',';
        temp.add(Integer.parseInt(number));
        number = "";
    } else if (c == '-') {
        //still not sure
    }
}

4 个答案:

答案 0 :(得分:3)

您可以使用String#split()两次来处理输入字符串。首先用逗号分隔,这使我们得到一个单独的数字或一个单独的数字范围。然后,在范围的情况下,再次用破折号分割以获得该范围的起始和结束数字。我们可以迭代该范围,将每个数字添加到我们的列表中。

String input = "1,25,3-6,14,16-19";
String[] parts = input.split(",");
List<Integer> list = new ArrayList<>();

for (String part : parts) {
    if (part.contains("-")) {
        String[] range = part.split("-");
        int start = Integer.parseInt(range[0]);
        int end = Integer.parseInt(range[1]);

        for (int i=start; i <= end; ++i) {
            list.add(i);
        }
    }
    else {
        int value = Integer.parseInt(part);
        list.add(value);
    }
}

这产生了以下数字列表:

1,25,3,4,5,6,14,16,17,18,19

在这里演示:

Rextester

答案 1 :(得分:3)

为确保没有重复项,并按预期顺序使用Set:

    String inputData = "1,25,3-6,14,16-19";
    String[] numberRanges = inputData.split(",");
    Set<Integer> set = new TreeSet<>();

    for (String numberRange : numberRanges) {
        if (numberRange.contains("-")) {
            String[] range = numberRange.split("-");
            int startIndex = Integer.valueOf(range[0]);
            int endIndex = Integer.valueOf(range[1]);
            for (int i = startIndex; i <= endIndex; ++i) {
                set.add(i);
            }
        } else {
            set.add(Integer.valueOf(numberRange));
        }
    }
    System.out.println(set);

答案 2 :(得分:1)

您可以尝试这样的事情:

String input = "1,25,3-6,14,16-19";

List<Integer> output = new ArrayList<Integer>();

for(String s : input.split(",")){
    try{
        if(!s.contains("-")){
           output.add(Integer.parseInt(s));
        }
        else{
            int i= Integer.parseInt(s.split("-")[0]);
            int upperBound = Integer.parseInt(s.split("-")[1]);
            for(;i<=upperBound;i++){
                 output.add(i);
            }
        }   
    }catch(NumberFormatException e){
            e.printStackTrace();
    }
}
Collections.sort(output); // sort the result
System.out.println(output); // test

<强>输出

[1, 3, 4, 5, 14, 16, 17, 18, 19, 25]

答案 3 :(得分:-2)

查看StringTokenizer