Выделить диапазоны из чисел массива Java

Есть массив [2,1,4,3,5,6,14,9,13,15].

На выходе должна получится строка, состоящая из найденных неразрывных диапазонов чисел и числа, которые остались без диапазона, через запятую:

[1-6,13-15,9]

Отсортировал массив, прошёлся по нему циклом. В итоге выходит только один общий диапазон [1-15], никак не могу догадаться, как мне разделить эти диапазоны. Прошу помощи.

private static String rangeSearch(int[] array) {
    StringBuilder stringBuilder = new StringBuilder();

    for (int i = 0; i < array.length-1 ; i++) {

        if (i == 0 && array[i + 1] - array[i] <= 1) {
            stringBuilder
                    .append(array[i])
                    .append("-");
        }

        if (array[i + 1] - array[i] > 1) {
            stringBuilder.append(array[i])
                    .append(",");
        }
          if ((array[i + 1] - array[i] > 1 && array[i + 2] - array[i + 1] == 1)) {
            stringBuilder
                    .append(array[i + 1])
                    .append("-");
        }
    }

    return stringBuilder.toString();
}

Остановился на подобном варианте. Из отсортированного массива - 0, 1, 2, 3, 4, 5, 8, 9, 11, 12, 13 Получается вывод:

0-5,8-9,11-

Данное условие - (array[i + 1] - array[i] > 1 && array[i + 2] - array[i + 1] == 1, для поиска других диапазонов, не верное, но больше ничего в голову не приходит. Возникает ошибка размерности массива, если его сделать меньше. Тут я встрял :(


Ответы (2 шт):

Автор решения: Harry

Ну, я в Java не знаток... Набросаю на C++ - когда уже есть отсортированный массив:

string s = "[";
int m = 1, M = 1;
for(int i = 1; i < size(a); ++i)
{
    if (a[i] == a[i-1]+1)
    {
        M = a[i];
    }
    else
    {
        s = s + to_string(m);
        if (m < M) s = s + "-" + to_string(M);
        s += ",";
        m = a[i];
    }
}
s = s + to_string(m);
if (m < M) s = s + "-" + to_string(M);
s += "]";

Примерно так. m и M - начало и конец диапазона.

→ Ссылка
Автор решения: Olmicron
private static String rangeSearch(int[] array) {
    StringBuilder stringBuilder = new StringBuilder("[");
    Arrays.sort(array);
    int min = array[0];
    int max = array[0];

    for ( int i : array ) {

        if ( max == i ) continue;

        if ( Math.abs(max-i) > 1 ){
            if ( stringBuilder.length() > 1 ) stringBuilder.append(",");
            stringBuilder.append(max == min ? min : min+"-"+max);
            min = i;
            max = i;
        } else {
            max = i;
        }

    }

    if ( stringBuilder.length() > 1 ) stringBuilder.append(",");
    stringBuilder.append(max == min ? min : min+"-"+max);
    stringBuilder.append("]");

    return stringBuilder.toString();
}
→ Ссылка