Раздельный поток чисел на группы более близких целых - PullRequest
0 голосов
/ 22 октября 2018

У меня есть поток чисел, таких как

[2872, 2997, 3121, 13055, 14178, 14302, 23134, 23382, 23507, 32832, 33677, 34017, 43415, 44246, 44374, 52866, 54035, 54158, 62835, 64243, 64936, 73110, 73890, 74014, 82809, 83771, 83899, 93436, 94765, 94891].

Я хотел бы разделить его следующим образом:

[[2872, 2997, 3121], [13055, 14178, 14302], [23134, 23382, 23507], [32832, 33677, 34017], [43415, 44246, 44374], [52866, 54035, 54158], [62835, 64243, 64936], [73110, 73890, 74014], [82809, 83771, 83899], [93436, 94765, 94891]].

Следует отметить, что расстояние между группами можетбыть ближе друг к другу, также цифры внутри группы могут быть дальше.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Разве вы не можете просто создать список из списка целых чисел (или массива массива) с размером N / 3 (N является суммой ваших чисел), а затем просто зациклить эту длину и поместить в нее минимальное число?

Примерно так (я не знаю, какой язык вы используете, поэтому я использую c # в качестве примера):

        int len = numbersStream.count();
        List<List<int>> BigList = new List<List<int>>();
        List<int> smallList = new List<int>();
        for (int i = 0; i < len; ++i)
        {
            smallList = new List<int>();
            for (int j = 0; j < 3; ++i)
            {
                int value = Math.Min(numbersStream);
                smallList.Add(value);
                numbersStream.remove(value);
            }
            BigList.Add(smallList);
        }

BigList будет: (2872, 2997, 3121),(13055, 14178, 14302) и т. Д. *

* При условии, что у вас всегда есть ровно% 3 числа, в противном случае вы просто настраиваете алгоритм, чтобы избежать исключений

0 голосов
/ 22 октября 2018

Решение в java, но в основном это находит среднюю дельту и группирует все в подмножество, если разница между этими двумя элементами меньше, чем это среднее значение.Вы можете точно настроить этот процесс, изменив, как работает AverageDelta

ps.Это решение предполагает, что ваш ввод не менее 1 большой и называется temp

int[] diffrence = new int[temp.length-1];

for (int i=1; i < temp.length; i++) {
    diffrence[i-1] = temp[i]-temp[i-1];
}
int averageDelta = (int) Math.round(Arrays.stream(diffrence).average().orElse(1.0));

List<List<Integer>> resultList = new ArrayList<>();
List<Integer> currentList = new ArrayList<>();
currentList.add(temp[0]);

for (int i=1; i < temp.length; i++) {
    if (temp[i]-temp[i-1] > averageDelta) {
        resultList.add(currentList);
        currentList = new ArrayList<>();
    }
    currentList.add(temp[i]);
}
resultList.add(currentList);
System.out.println(resultList.toString());
0 голосов
/ 22 октября 2018

Это не ответ, а способ взглянуть на ваши данные, который должен быть проницательным.

Исходные значения:

enter image description here

Дельты:

enter image description here

...