2013-07-08 2 views
0

У меня есть многомерный массив с двойными значениями, которые я хотел бы разобраться ..Java - сортирует многомерный массив двойной

//declare array  
standingsB = new Double[10][2]; 

//populate array from the temparray created during read from file 
arryLgt = 0; 
     for (int row = 0; row < standingsB.length; row++){ 

      for (int column = 0; column < standingsB[row].length; column++) { 


       standingsB[row][column] = Double.parseDouble(tempStandingsArray[arryLgt]); 
       arryLgt = arryLgt + 1; 
      } 
     } 

Массив имеет такие значения, как [1.5,7.0] [4.2,4.0] и т.д. ...

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

Arrays.sort(standingsB, new Comparator<Double[]>() { 
      @Override 
      public int compare(Double[] s1, Double[] s2) { 
       compare(s1, s2); 
      } 
     }); 

выше не удается скомпилировать (с отсутствует возвращаемая ста tement), что следует ожидать, поскольку я понятия не имею, как использовать Array.sort с компаратором. Но я даже не уверен, что я на правильной странице, как новичок в Java (и вообще программирование), как и я.

Спасибо, что посмотрели!

+0

Вам нужно написать 'return compare (s1, s2);'. Однако вы должны сказать нам, что это означает, что для одного «Двойного []» будет «больше» или «меньше» другого. – Jashaszun

+0

Или дайте нам пример ввода/вывода (наряду с некоторым объяснением). – arshajii

+0

Что вы понимаете, сортируя двухмерный массив? {{3,5,2}, {1,4,6}} -> {{1,2,3}, {4,5,6}}? –

ответ

3

Вы довольно близко. Ваш компаратор будет зависеть от того, в каком порядке вам нужны ваши результаты. Предположим, вы хотите, чтобы строки сортировались в естественном порядке первого элемента в каждой строке. Тогда ваш код будет выглядеть так:

Arrays.sort(standingsB, new Comparator<Double[]>() { 
    public int compare(Double[] s1, Double[] s2) { 
     if (s1[0] > s2[0]) 
      return 1; // tells Arrays.sort() that s1 comes after s2 
     else if (s1[0] < s2[0]) 
      return -1; // tells Arrays.sort() that s1 comes before s2 
     else { 
      /* 
      * s1 and s2 are equal. Arrays.sort() is stable, 
      * so these two rows will appear in their original order. 
      * You could take it a step further in this block by comparing 
      * s1[1] and s2[1] in the same manner, but it depends on how 
      * you want to sort in that situation. 
      */ 
      return 0; 
     } 
    } 
}; 
+0

Спасибо!Код работает сейчас, как я хочу! Я собираюсь вставить некоторые println, чтобы я мог понять, что передается и что сравнивается в s1 [0] и s2 [0], в этот момент они всего лишь некоторые волшебные/вуду, делающие вещи сортированными! :) – Snay

-1

Arrays.sort() ожидает один размерный массив, в то время как в вашем случае вы пытаетесь передать многомерный массив.

например Двойной [] d = {1,0,5,2,3,2};

Затем вы используете Arrays.sort (d), поскольку сортировка может работать с примитивными типами или типами обертки.

+0

Многомерные массивы _are_ одномерные массивы, т. Е. Массивы массивов. Поэтому вы _can_ передаете их в Arrays.sort(). Типы элементов будут самими массивами, и вы должны определить Comparator, который работает на этих массивах. – ajb

+0

@ajb, получил его - спасибо за освобождение. – user2506840

1

Я думаю, что ответ, предоставленный @Tap, не удовлетворяет вопрос афер на 100%. Как описано, массив сортируется для своего значения только при первом индексе. Результатом сортировки {{2,0},{1,2},{1,1}} будет {{1,2},{1,1},{2,0}} не {{1,1},{1,2},{2,0}}, как и ожидалось. Я реализовал общий ArrayComparator для всех типов, реализующих интерфейс Comparable и выпустил его on my blog:

public class ArrayComparator<T extends Comparable<T>> implements Comparator<T[]> { 
    @Override public int compare(T[] arrayA, T[] arrayB) { 
     if(arrayA==arrayB) return 0; int compare; 
     for(int index=0;index<arrayA.length;index++) 
      if(index<arrayB.length) { 
       if((compare=arrayA[index].compareTo(arrayB[index]))!=0) 
        return compare; 
      } else return 1; //first array is longer 
     if(arrayA.length==arrayB.length) 
      return 0; //arrays are equal 
     else return -1; //first array is shorter 
    } 
} 

С этим ArrayComparator вы можете сортировать многомерные массивы:

String[][] sorted = new String[][]{{"A","B"},{"B","C"},{"A","C"}}; 
Arrays.sort(sorted, new ArrayComparator<>()); 

Lists массивов:

List<String[]> sorted = new ArrayList<>(); 
sorted.add(new String[]{"A","B"}); 
sorted.add(new String[]{"B","C"}); 
sorted.add(new String[]{"A","C"}); 
sorted.sort(new ArrayComparator<>()); 

И накопить (Sorted)Maps легко:

Map<String[],Object> sorted = new TreeMap<>(new ArrayComparator<>()); 
sorted.put(new String[]{"A","B"}, new Object()); 
sorted.put(new String[]{"B","C"}, new Object()); 
sorted.put(new String[]{"A","C"}, new Object()); 

Просто помните, что общий тип должен реализовывать интерфейс Comparable.

Смежные вопросы