Представление массива (String []) в виде строкового CSV с диапазонами - PullRequest
1 голос
/ 31 января 2012

У меня есть массив строк, которые содержат числа ( целые числа без знака ), дополненные произвольным числом нулей, например:

[ 0001, 0002, 0003, 0005,0007, 0010,0011,0012,0013,0014, 0015 ]

Я хочу преобразовать массив в представляющую строку, представляющая строка должна объединять смежные значения с представлением диапазона (0000-0003) и несмежными значениями в виде значений, разделенных запятыми, поэтому, например, должен быть представлен вышеуказанный массив строк как следует, представляющий строку:

0001-0003, 0005, 0007, 0010-0015

Какой самый лучший / простой / более читаемый способ сделать это (без написания тонны кода :-))?

Спасибо.

Ответы [ 3 ]

1 голос
/ 31 января 2012

Если я правильно понял требования, то следующий код должен работать для вас: (надеюсь, это не совсем tons of code :-))

String[] arr = new String[] {"0001", "0020", "0002", "0003", "0019", "0005", "0007",
                             "0010", "0018", "0011", "0012", "0013", "0014", "0015"};
Map<Integer, String> m = new TreeMap<Integer, String>();
for (String s : arr)
    m.put(new Integer(s), s);
Iterator<Entry<Integer, String>> it;
Integer prev = -1;
StringBuffer sb = new StringBuffer();
boolean isCont = false;
for (it=m.entrySet().iterator(); it.hasNext();) {
    Entry<Integer, String> entry = it.next();
    if (prev == -1)
        sb.append(entry.getValue());
    else if (entry.getKey() == (prev+1))
        isCont = true;
    else if (entry.getKey() > (prev+1)) {
        if (isCont)
            sb.append('-').append(m.get(prev)).append(", ");
        else
            sb.append(", ");
        sb.append(entry.getValue());
        isCont = false;
    }
    prev = entry.getKey();
}
if (isCont)
    sb.append('-').append(m.get(prev));
System.out.println(sb);

ВЫХОД:

0001-0003, 0005, 0007, 0010-0015, 0018-0020
0 голосов
/ 31 января 2012

Вот мой ответ, конечно, у всех разные вкусы.

    String[] a = { "0001", "0002", "0003", "0005", "0010" , "0011" , "0012" , "0013" , "0014", "0015", "0017" };

    String out = new String();
    String curStart = null;
    String curEnd = null;
    for (int i=0; i<a.length; i++) {
        if (curStart == null) curStart = a [i];
        if ( a.length != i+1 
             && Integer.parseInt(a[i])+1 == Integer.parseInt(a[i+1])) {
            curEnd = a[i+1];
        } else {
            if (!out.equals("")) out+=", ";
            out+=""+curStart;
            if (curEnd != null) out+="-"+curEnd;
            curStart = null;
            curEnd = null;              
        }

    }

    System.out.println(out);
0 голосов
/ 31 января 2012

Я бы сделал это, обработав каждую строку как свой собственный диапазон, объединив смежные вместе, и специализировав мою реализацию Range.toString() для случая отдельного элемента.Что-то вроде:

class Range {
  int low;
  int high;
  public Range(int elem) { this.low = elem; this.high = elem;}
  private Range(int low, int high) { this.low=low; this.high=high;}
  public Range tryMerge(Range other) { 
    if(high + 1 == other.low) {
      return new Range(low, other.high);
    } else {
      return null;
    }
  }
  public String toString() {
    return (low == high) ? Integer.toString(low) : low + "-" + high;
  }
}

с, возможно, еще кое-чем, связанным с заполнением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...