Выделить диапазоны из чисел массива 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 шт):
Ну, я в 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 - начало и конец диапазона.
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();
}