Dato un array di valori int, come si può analizzare la serie nella notazione della sequenza di conteggio?Java: Converti int [] nella rappresentazione più piccola come intervalli
Esempi:
{1, 2, 3, 4, 5, 9, 13, 14, 15} -> "1-5,9,13-15"
{4, 6, 8, 10, 11, 12, 15, 17} -> "4,6,8,10-12,15,17"
Sto cercando un metodo che avrebbe prodotto questi risultati. Questo è quello che ho finora, ma sto molto perplesso a questo punto:
Codice di prova:
import java.util.Arrays;
public class TestSequencing {
public static void main(String[] args) {
int[] numbers1 = {1, 2, 3, 4, 5, 9, 13, 14, 15};
String numbers1s = "1-5,9,13-15";
System.out.println(Arrays.toString(numbers1));
System.out.println("Expected:\t" + numbers1s);
System.out.println("Produced:\t" + sequenceNums(numbers1) + "\n");
int[] numbers2 = {3, 5, 6, 9, 12};
String numbers2s = "3,5-6,9,12";
System.out.println(Arrays.toString(numbers2));
System.out.println("Expected:\t" + numbers2s);
System.out.println("Produced:\t" + sequenceNums(numbers2) + "\n");
int[] numbers3 = {1, 2, 3, 4, 5, 6, 7};
String numbers3s = "1-7";
System.out.println(Arrays.toString(numbers3));
System.out.println("Expected:\t" + numbers3s);
System.out.println("Produced:\t" + sequenceNums(numbers3) + "\n");
}
public static String sequenceNums(int[] nums) {
StringBuilder sb = new StringBuilder();
int rangeStart = nums[0];
int previous = nums[0];
int current;
int expected = previous + 1;
for (int i = 1 ; i < nums.length ; i++) {
current = nums[i];
expected = previous + 1;
if (current != expected || i == (nums.length - 1)) {
if (current == rangeStart) {
sb.append(previous + ",");
} else {
sb.append(rangeStart + "-" + previous + ",");
}
rangeStart = current;
}
previous = current;
}
if (sb.charAt(sb.length() - 1) == ',') {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
}
uscita:
[1, 2, 3, 4, 5, 9, 13, 14, 15]
Expected: 1-5,9,13-15
Produced: 1-5,9-9,13-14
[3, 5, 6, 9, 12]
Expected: 3,5-6,9,12
Produced: 3-3,5-6,9-9
[1, 2, 3, 4, 5, 6, 7]
Expected: 1-7
Produced: 1-6
@SotiriosDelimanolis Si prega di essere costruttivi con i vostri commenti. Il mio risultato previsto è chiaramente indicato e l'esempio che ho fornito esemplifica che il mio codice non produce i risultati che sto cercando. –
Ti sto chiedendo perché non fa quello che volevi. Lo hai messo a punto? Cosa hai trovato? –
@SotiriosDelimanolis Suppongo che il problema abbia qualcosa a che fare con la mancanza dell'ultimo numero nell'array. Ho provato idee diverse usando altre strutture di controllo del flusso, ma non ho idea di come possa essere fatto. Il campione che ho fornito è il più vicino che sono venuto a risolvere il mio problema, tuttavia, quindi l'ho postato qui nella speranza di nuove idee da nuove menti. –