从给定的String中获取数据,用java中的(,, - )分隔

时间:2015-10-13 12:02:33

标签: java

我有一个像"5006,3030,8080-8083"这样的字符串。

我希望每个元素与String分开:

5006
3030
8080
8081
8082
8083

这是我的代码:

int i=0,j=0;
String delim = "[,]";
String hyphon = "[-]";
String example = "5006,3030,8080-8083";
String p[] = example.split(delim);
int len = p.length;
for(i=0;i<len;i++) {
    String ps[]=p[i].split(hyphon);
    if(ps.length>1) {
        int start =  Integer.parseInt(ps[0]);
        int finish = Integer.parseInt(ps[1]);
        int diff = finish-start+1;
        for(j=0;j<diff;j++) {
            System.out.println(start+j);
        }
    } else if(ps.length==1) {
        System.out.println(ps[0]);
    }
}

有没有更好的解决方案或任何简化我的代码的类?

我也希望这些数字按升序排列。

9 个答案:

答案 0 :(得分:4)

试试这段代码:

public static void main(String[] args) {
 String input = "5006,3030,8080-8083";
 List<Integer> list = new ArrayList<Integer>();
 String[] numbers = input.split(",");

 for (String s : numbers) {
    if (s.contains("-")) {
      String[] range = s.split("-");
      int from = Integer.parseInt(range[0]);
      int to = Integer.parseInt(range[1]);
      for (int i = from; i <= to; i++) {
         list.add(i);
      }
    } 
    else {
      list.add(Integer.parseInt(s));
    }
 }

System.out.println("in asc order");
Collections.sort(list);
System.out.println(list.toString());

System.out.println("in desc order");
Collections.reverse(list);
System.out.println(list.toString());

}

我的输出:

in asc order
[3030, 5006, 8080, 8081, 8082, 8083]
in desc order
[8083, 8082, 8081, 8080, 5006, 3030]

答案 1 :(得分:2)

你很高兴;您可以使用enhanced for loop和while循环来最小化计数器变量。

String example = "5006,3030,8080-8083";
String[] parts=example.split(",")

ArrayList<Integer> numbers = new ArrayList<Integer>();

for(String part: parts)
{

   if(part.contains("-"))
   {

      String subParts[]=part.split("-");

      int start =  Integer.parseInt(subParts[0]);
      int finish = Integer.parseInt(subParts[1]);


       while(start <= finish)
       {
       numbers.add(start);
           System.out.println(start++);

       }
   }
   else {
        System.out.println(part);
    numbers.add(Integer.parseInt(part));
    }

}

Integer[] sortedNumbers = new Integer[numbers.size()];
sortedNumbers = Arrays.sort(numbers.toArray(sortedNumbers));    

更新来自评论):
数字现在排序。

答案 2 :(得分:2)

  

我也希望这些数字按升序排列。

这会给整个程序带来意想不到的变化,因为一旦你意识到随时随地打印,你就需要从头开始。

首先要做的是选择合适的代表。您似乎表示整数范围,因此首先要为它们定义一个类:

class IntRange : Comparable<IntRange> {
    private int low, high;
    public int getLow() {return low;}
    public int getHigh() {return high;}
    public IntRange(int low, int high) {
        // Add range check to see if low <= high
        this.low = low; this.high = high;
    }
    public IntRange(int point) {low = high = point;}
    @Override
    public void print() {
        for (int i = low ; i <= high ; i++) {
            System.out.println(i);
        }
    }
    @Override
    public int compareTo(IntRange other) {
        ...
    }
}

现在,您可以使用代码在[,]上拆分,然后拆分[-],构建IntRange,并将其放入ArrayList<IntRange>。之后,您可以使用sort()方法对范围进行排序,并按所需顺序打印它们。

但是等等,你的问题远不止眼睛。想想这样的输入会发生什么:

1,5,3-7,6

应该在哪里打印56?在3-7之前或之后打印它是不好的,所以诀窍是删除范围内的点。

但即使这不是全部:你对这个输入做了什么?

1-5,3-7

您应该打印数字1到7(包括1和7),但这需要合并两个范围。有效地执行此操作有一个良好的数据结构。它被称为range tree。如果您的输入预计很大,则应考虑使用范围树表示。

答案 3 :(得分:1)

试试这个

String str = "5006,3030,8080-8083";       
      String[] array = str.split(",");
      String ans = "";        
      for(int i = 0; i < array.length; i++){
          if(array[i].contains("-")){
              String[] array2 = array[i].split("-");                  
              int start = Integer.parseInt(array2[0]);
              int end = Integer.parseInt(array2[array2.length - 1]);

              for(int j = start; j <= end; j++){
                  ans = ans + j + ",";                    
              }                                                   
          }
          else{
              ans = ans + array[i] + ",";
          }
      }

      System.out.print(ans);

答案 4 :(得分:1)

此代码假设所有整数均为正数。

task = raw_input("would you like to encrypt or decrypt\r\n:- ").lower()

答案 5 :(得分:0)

使用java 8 stream api:

public static void main(String[] args) {
    String s = "5006,3030,8080-8083";
    Arrays.stream(s.split(","))
        .flatMap(el -> el.contains("-") ? rangeToStream(el) : Stream.of(Integer.valueOf(el)))
        .sorted()
        .forEachOrdered(e -> System.out.println(e));
}

private static Stream<? extends Integer> rangeToStream(String el) {
    AtomicInteger[] bounds = Arrays.stream(el.split("-")).map(e -> new AtomicInteger(Integer.parseInt(e))).toArray(size -> new AtomicInteger[2]);
    return Arrays.stream(new Integer[bounds[1].get() - bounds[0].get() + 1]).map(e -> bounds[0].getAndIncrement());
}

答案 6 :(得分:0)

使用Guava's functional idioms,您可以以声明方式实现此,从而避免使用详细的命令式 for循环。首先声明一个标记化函数,它将逗号分隔的字符串中的每个标记转换为Iterable<Integer>

private static final Function<String, Iterable<Integer>> TOKENIZER =
    new Function<String, Iterable<Integer>>() {  

    /**
     * Converts each token (e.g. "5006" or "8060-8083") in the input string
     * into an Iterable<Integer>; either a ContiguousSet or a List with a
     * single element
     */
    @Override
    public Iterable<Integer> apply(String token) {

        if (token.contains("-")) {
            String[] range = token.trim().split("-");
            return ContiguousSet.create(
                    Range.closed(Integer.parseInt(range[0]),
                            Integer.parseInt(range[1])),
                    DiscreteDomain.integers());
        } else {
            return Arrays.asList(Integer.parseInt(token.trim()));
        }
    }
};

然后将该函数应用于输入:

String input = "5006,3030,8080-8083";

Iterable<String> tokens = Splitter.on(',').trimResults().split(input);

SortedSet<Integer> numbers = Sets.newTreeSet();
Iterables.addAll(numbers,
        // concat flattens the Iterable<Iterable<Integer>>
        // into an Iterable<Integer>
        Iterables.concat(Iterables.transform(tokens, TOKENIZER)));

由于所有逻辑基本上都编码到Function中,客户端代码只需要将字符串标记为Iterable<String>Splitter),然后应用Function }通过Iterables.transform,使用Iterables.concat展平转换结果,最后将结果Iterable<Integer>添加到SortedSet<Integer>中,以保持数字按升序排列。

答案 7 :(得分:0)

U可以编写类似这样的代码 -

    String s="5006,3030,8080-8083";
    String s2[]=s.split(",");
    List<Integer> li= new ArrayList<Integer>();
    List<Integer> numbers= new ArrayList<Integer>();
    for(int i=0;i<s2.length;i++){
        if(s2[i].contains("-")){
            li.add(i);
        }
        else{
            numbers.add(Integer.parseInt(s2[i]));
        }
    }
    for(Integer i:li){
        String str=s2[i];
        String strArr[]=str.split("-");
        for(int  j=Integer.parseInt(strArr[0]);j<=Integer.parseInt(strArr[1]);j++){
            numbers.add(j);
        }
    }
    Collections.sort(numbers);
    for(Integer k:numbers){
        System.out.println(k);
    }

答案 8 :(得分:-1)

public static void main(String[] args) 
    {
       String example = "5006,3030,8080-8083";
       String[] splitString = example.split(",");
       List<Integer> soretedNumbers = new ArrayList<>();
       for(String str : splitString)
       {
           String[] split2 = str.split("-");
           if(split2.length == 1)
           {
               soretedNumbers.add(Integer.parseInt(str));
           }
           else
           {
               int num1 = Integer.parseInt(split2[0]);
               int num2 = Integer.parseInt(split2[1]);
               for(int i = num1;i <= num2; i++)
               {
                   soretedNumbers.add(i);
               }
           }
       }
       Collections.sort(soretedNumbers);
       for(int i : soretedNumbers)
       {
           System.out.println(i);
       }
    }