2014-11-26 2 views
2

У меня есть 2d массив двойных значений, и я хочу, чтобы разбить его на кучу массивов на основе значения в массиве Например, если у меня было:разделение и сортировка массива на несколько массивов

{2, 0.0}, 
{3, 0.0}, 
{1, 0.0}, 
{2, 1.0}, 
{5, 0.0}, 
{7, 1.0}, 
{6, 2.0} 

Я хочу разделить это на массивы, как этот

{0.0, 2, 3, 1, 5} 
{1.0, 2, 7} 
{2.0, 6} 

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

, например, перебирая в первом списке занимает 7 * 6/2 = 21 сравнений

Перебор второго списков принимает 7, чтобы разбить его, и 7 сравнений все внутри списков, то есть. {2/3, 2/1, 2/5. 3/1, 3/5, 1/5}, {2,7}, {}

Как бы я мог заниматься чем-то подобным, или есть лучший способ их сравнения?

+2

Итак, вы полностью привязаны к массивам? Не могли бы вы перейти к другой структуре данных? Если это так, то словарь будет идеально подходит для этой ситуации, поскольку они предназначены для этого случая использования. – CBredlow

+0

Я не очень привязан к массивам, но мне нравится производительность, которую они дают, что такое словарь? – spyr03

+1

Для извлечения, O (1). Пусть даже карта со значениями типа ArrayList будет работать. – CBredlow

ответ

2

Было бы только одной итерации с помощью HashMap ...

Algo

1) пересекают каждую строку 2D массива

2) myHashMap.add(arr[i][1], arr[i][0]) // add(key,value)

3) Повторите

0

Вместо использования 2D-массива я бы рекомендовал использовать другой структура данных, такая как HashMap или HashTable: https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html.

Это позволит ускорить поиск и упростить код.

Пример того, как ваша карта может выглядеть:

HashMap map = new HasMap<Double, ArrayList<Integer>>(); //key is the 0.0, 2.0, whatever, and the value mapped is an array of integers that have those values. (2, 3, 1, 5 for 0.0) 

Однако импортирования может занять некоторое время, но после того, как вы его все готово, вы можете сделать что-то вроде этого, чтобы обновить значения. Предположите, что вы хотите добавить 10, который имел 0,0 в качестве значения:

ArrayList<Integer> array = map.get(0.0); 
array.add(10); 
map.put(0.0, array); //replaces the old value with the updated array. 
Смежные вопросы