×

Welcome to TagMyCode

Please login or create account to add a snippet.
1
0
 
0
Language: Java
Posted by: Gerrit Viljoen
Added: Jul 25, 2014 10:37 AM
Modified: Jul 25, 2014 10:40 AM
Views: 14
Parse an integer list to a list of integers. Can handle integer ranges. Ignores ws.

Example:
"1,3-5,7" ~> [1, 3, 4, 5, 7]
"0,-1,1" ~> [0, -1, 1]
  1.     public static List<Integer> parseIntegerList(CharSequence text) {
  2.         if (text == null) {
  3.             return new ArrayList();
  4.         } else {
  5.             List<Integer> list = new ArrayList();
  6.             StringBuilder builder1 = new StringBuilder();
  7.             StringBuilder builder2 = new StringBuilder();
  8.             boolean noRangeSeparator = true;
  9.             for (int a = 0; a <= text.length(); a++) {
  10.                 final char c = (a < text.length()) ? (text.charAt(a)) : (',');
  11.                 if (Character.isDigit(c)) {
  12.                     if (noRangeSeparator) {
  13.                         builder1.append(c);
  14.                     } else {
  15.                         builder2.append(c);
  16.                     }
  17.                 } else if (c == '-') {
  18.                     if (noRangeSeparator) {
  19.                         noRangeSeparator = false;
  20.                     } else {
  21.                         throw new IllegalArgumentException("Invalid [text] argument: second range separator");
  22.                     }
  23.                 } else if (c == ',') {
  24.                     if (noRangeSeparator) {
  25.                         if (builder1.length() > 0) {
  26.                             list.add(Integer.parseInt(builder1.toString()));
  27.                         }
  28.                     } else {
  29.                         if (builder2.length() == 0) {
  30.                             throw new IllegalArgumentException("Invalid [text] argument: invalid range");
  31.                         } else if (builder1.length() == 0) {
  32.                             list.add(Integer.parseInt("-" + builder2.toString()));
  33.                         } else {
  34.                             final int start = Integer.parseInt(builder1.toString());
  35.                             final int end = Integer.parseInt(builder2.toString());
  36.                             if (end < start) {
  37.                                 throw new IllegalArgumentException("Invalid [text] argument: invalid range");
  38.                             }
  39.                             for (int b = start; b <= end; b++) {
  40.                                 list.add(b);
  41.                             }
  42.                         }
  43.                     }
  44.                     builder1 = new StringBuilder();
  45.                     builder2 = new StringBuilder();
  46.                     noRangeSeparator = true;
  47.                 } else if ((!Character.isWhitespace(c)) && (!Character.isISOControl(c))) {
  48.                     throw new IllegalArgumentException("Invalid [text] argument: contains illegal characters");
  49.                 }
  50.             }
  51.             return list;
  52.         }
  53.     }