2015-11-19 4 views
4

Я пытаюсь сортировать ArrayList с помощью предопределенного массива индексов. Мой текущий пример использует копию оригинального ArrayList для сортировки и, следовательно, не является масштабируемым для ArrayLists более крупных объектовСортировка ArrayList с использованием предопределенного списка индексов

package sortExample; 

import java.awt.List; 
import java.util.ArrayList; 
import java.util.Arrays; 

public class sortExample { 

    public static void main(String[] args) { 

     String [] str = new String[] {"a","b","c","d"}; 
     ArrayList<String> arr1 = new ArrayList<String>(Arrays.asList(str)); 

     int [] indices = {3,1,2,0}; 

     ArrayList<String> arr2 = new ArrayList(arr1.size()); 

     for (int i = 0; i < arr1.size(); i++) { 
      arr2.add("0"); 
     } 

     int arrIndex = 0; 
     for (int i : indices){ 
      String st = arr1.get(arrIndex); 
      arr2.set(i, st); 
      arrIndex++; 
     } 

     System.out.println(arr1.toString()); 
     System.out.println(arr2.toString()); 
    } 

} 
+0

что ваш вопрос? это немного сложно, как вы это делаете, но он работает ...... – ParkerHalo

+0

Можно ли отсортировать ArrayList arr1 с помощью массива индексов без создания копии arr2? – scs

+0

Почему вы не просто используете Collections.sort()? – VDanyliuk

ответ

2

Для повторного использования те же данные, пожалуйста, см мое решение:

public static void main(String[] args) { 

    String[] strs = new String[]{"a", "b", "c", "d"}; 
    int[] indices = {3, 1, 2, 0}; 

    String tmp; 
    for (int i = 0; i < strs.length; i++) { 
     if (i != indices[i]) { 
      tmp = strs[i]; 
      strs[i] = strs[indices[i]]; 
      strs[indices[i]] = tmp; 

      indices[indices[i]] = indices[i]; 
      indices[i] = i; 
     } 
    } 

    for (int i : indices) { 
     System.out.print(i + " "); 
    } 
    System.out.println(); 
    for (String str : strs) { 
     System.out.print(str + " "); 
    } 
} 

Выход есть:

DBCA

+1

@scs - переупорядочение массива на месте в соответствии с массивом индексов будет более сложным, чем копирование в другое массив в соответствии с массивом индексов. Сложная временная сложность изменения порядка O (n), так как каждый своп помещает по крайней мере один элемент на место. Существует несколько более быстрое изменение этого параметра, которое переставляет циклы, которые вращают подмножества (или все) исходного массива. Для циклов из 2 это все еще своп, для циклов 3 или более, если они существуют, то метод rotate немного быстрее, temp = 1st element, 1st element = 2nd element, 2nd element = 3rd element, ... , nth element = temp. – rcgldr

+0

@rcgldr Я должен признать, что я не проводил исследований по алгоритму переупорядочения в глубину - сложность O (n) была достаточной для моих нужд. – scs

+0

@hsnkhrmn: Теперь я вижу, что ответ выше использует коммутацию и является более элегантным, чем мой пример. Я подал ваше решение на голосование. В моем вопросе я думал о java-функции, которую я мог бы упустить, когда решение является однострочным. – scs

1

Существует а (немного) более простое решение:

int [] indices = {3,1,2,0}; 
ArrayList<String> arr2 = new ArrayList<String>(); 

for (int i = 0; i < arr1.size(); i++) { 
    arr2.add(arr1.get(indices[i])); 
} 
+0

К сожалению, я могу отметить только один принятый ответ. Вместо этого я проголосовал за ваш ответ. – scs

+0

все хорошо;) ty mate! – ParkerHalo

2

Альтернативный перезаказ на месте на основе циклов. Обратите внимание, что индексы будут изменены на {0,1,2,3}. У меня нет установленной Java (пока), поэтому я преобразовал рабочий код на C++ в то, что я считаю правильным синтаксисом Java.

for (int i = 0; i < arr1.size(); i++) { 
     if(i != indices[i]) { 
      String st = arr1.get(i); 
      int t = indices[i]; 
      int k = i; 
      int j; 
      while(i != (j = indices[k])){ 
       arr1.set(k, arr1.get(j)); 
       indices[k] = k; 
       k = j; 
      } 
      arr1.set(k, st); 
      indices[k] = k; 
     } 
    } 

В данном конкретном случае {3,1,2,0}, все это делает подкачки 0 и 3. Самый длинный цикл происходит, когда индексы повернуты, например, {3 0 1 2}, в в этом случае st = arr1 [0], arr1 [0] = arr1 [3], arr [3] = arr1 [2], arr1 [2] = arr1 [1], arr1 [1] = st.

1

На нижнем уровне используйте «индексы» для нового массива.

public class Sorting { 
    public static void main(String[] args) { 
     String [] str = new String[] {"a","b","c","d"}; 

      int [] indices = {3,1,2,0}; 

      String sorted [] = new String [str.length] ; 
      int i = 0; 
      for (String string : str) { 
       sorted[indices[i]] = string; 
       i++; 
      } 

      for (String string : sorted) { 
       System.out.print(string + " "); 
      } 
    } 
} 

печатает: d б р а

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