2015-02-11 2 views
0

Мне нужно отсортировать двухмерный arrylist java и получить индекс отсортированного элемента. чтобы сделать это, я написал этот код 1. Сначала я сделать общий класс для сортировки элемента массива и получить исходный индекс отсортированных элементов:Сортировка 2d arraylist и получить индекс java

public static int[] Sort_Index(double[] arr){ 
      int[] indices = new int[arr.length]; 
       indices[0] = 0; 
       for(int i=1;i<arr.length;i++){ 
        int j=i; 
        for(;j>=1 && arr[j]<arr[j-1];j--){ 
          double temp = arr[j]; 
          arr[j] = arr[j-1]; 
          indices[j]=indices[j-1]; 
          arr[j-1] = temp; 
        } 
        indices[j]=i; 
       } 
       return indices;//indices of sorted elements 
     } 

я использовал этот цикл, чтобы устроить Список_массивы у

for(int i=0;i<Input.General_Inputs.Num_objectives;i++){ 
      double[] sort_y=new double[y.size()]; 
      for(int row=0;row<y.size();row++) 
       sort_y[row]=y.get(row).get(Input.General_Inputs.Num+i); 
      int[] sort_y_index=Sort_Index(sort_y); 

     } 
    } 

Следующим шагом для меня является использование этого индекса для хранения значения в y arraylist новому arraylist. Но я думаю, что это абсолютно неэффективно, какие-то лучшие идеи?

ответ

0

Вы можете создать класс оберточной исходные показатели:

private static class ElementWithIndices<E> { 
    private final E e; 
    private final int i; 
    private final int j; 
    // + constructor, getters, setters 
} 

И потом:

List<List<E>> list = // ... 
List<List<ElementWithIndices<E>>> listWithIndices = convert(list); 
Collections.sort(listWithIndices, myComparator); // compare on the Es 
// listWithIndices now contains the sorted elements with their original indices 
+0

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

1

Что вы можете сделать, это создать отдельную структуру индекса, который содержит указатели на данные (в этом индексы case) и просто сортировать структуру индекса. Исходные данные останутся нетронутыми.

Вот и пример

public static void main(String[] args) { 
    double[] data = new double[]{123.123, 345.345, -5, 10, -123.4}; 
    ArrayList<Integer> index = new ArrayList<>(data.length); 
    for(int i = 0; i<data.length; i++) { 
     index.add(i); 
    } 
    Collections.sort(index, new Comparator<Integer>() { 

     @Override 
     public int compare(Integer o1, Integer o2) { 
      return Double.compare(data[o1], data[o2]); 
      //notice that we are comparing elements of the array *data*, 
      //but we are swapping inside array *index* 
     } 
    }); 
    for(int i = 0; i<index.size(); i++) { 
     System.out.println(data[index.get(i)]); 
    } 
} 

Таким образом, вы получите отсортированные данные и получить сохранить оригинальные индексы.

Производительность - это неэффективно на уровне процессора для небольших элементов из-за большого количества прыжков с памятью. Вам лучше создать пару (index, data_element), а затем просто отсортировать все пары.

Эффективно, когда объекты, которые мы сортируем, являются большими объектами.

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