2015-12-13 2 views
1

объектов в ArrayList<CustomObject>array A являются несортированными:Сортировка Список_массивы объектов с помощью другого массива

ID: [6, 3, 2, 5, 4, 1] 

С другой частью программы я получил array B. Нужно отсортировать объекты в array A от собственности int ID в пути array B сортируется:

[3, 6, 4, 5, 1, 2] 

Так array A должен быть окончательно сортируется как:

[3, 6, 4, 5, 1, 2] 

Так объекты в array A сортируются по идентификатору так же, как предметы в array B есть.

Что было бы лучшим способом его реализовать?

+0

Что такое тест заказа? –

+0

@ cricket_007, окончательный внешний вид порядка, который мне нужен, чтобы достичь –

+0

Вы пытаетесь сортировать в отношении чего-то? Какая у вас функция сравнения? Ваш результат не возрастает или нисходит, поэтому будет сложно получить то, что вы ищете. –

ответ

2

Попробуйте это.

List<CustomObject> a = Arrays.asList(
     new CustomObject(6), 
     new CustomObject(3), 
     new CustomObject(2), 
     new CustomObject(5), 
     new CustomObject(4), 
     new CustomObject(1) 
    ); 
    System.out.println(a); 
    int[] b = {4, 6, 5, 3, 1, 2}; 
    Map<Integer, Integer> map = new HashMap<>(); 
    for (int i = 0; i < b.length; ++i) 
     map.put(b[i], i); 
    // for Java8 
    // Collections.sort(a, (l, r) -> map.get(l.id) - map.get(r.id)); 
    Collections.sort(a, new Comparator<CustomObject>() { 
     @Override 
     public int compare(CustomObject l, CustomObject r) { 
      return map.get(l.id) - map.get(r.id); 
     } 
    }); 
    System.out.println(a); 
+0

спасибо, кажется, решение. Но не могли бы вы переделать его без использования лямбда? Android не справляется с Java 1.8, жаль, что cricket_007 удалил теги 'Android' из вопроса –

+0

Как« (l, r) -> map.get (l.id) - map.get (r.id) " Работа?? – Amita

+0

@Amita Я изменил свой код на старый стиль. – saka1029

0

Это может полезно для вас:

public static void main(String[] args) { 
    HashMap<Integer, Integer> myMap = new HashMap(); 
    int arrayA[] = {6, 3, 2, 5, 4, 1}; 
    int arrayB[] = {3, 6, 4, 5, 1, 2}; 
    for (int i = 0; i < arrayA.length; i++) { 
     if (myMap.containsKey(arrayA[i])) { 
      int pValue = myMap.get(arrayA[i]); 
      pValue++; 
      myMap.put(arrayA[i], pValue); 
     } else if (!myMap.containsKey(arrayA[i])) { 
      myMap.put(arrayA[i], 1); 
     } 
    } 
    int l = 0; 
    for (int i = 0; i < arrayB.length; i++) { 
     if (myMap.containsKey(arrayB[i])) { 
      int pValue = myMap.get(arrayB[i]); 
      for (int k = 0; k < pValue; k++) { 
       arrayA[l++] = arrayB[i]; 
      } 
     } 
    } 
    System.out.println(Arrays.toString(arrayA)); 

} 

Out-ставить:

[3, 6, 4, 5, 1, 2] 
+0

Дубликат 'contains' на том же элементе излишне дорого. – ChiefTwoPencils

0

подход

  1. Сначала нужно создать объект компаратор инициализировать его с требуемым arrayOrder
  2. Вызовите Collection.sort с объектом сравнения

Я понимаю, что это может быть более чем убить простое решение указанного выше. но я пытался использовать Comparator интерфейс от java.utils

import java.util.List; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 

class CustomerCompartor implements Comparator<Customer> { 
    @SuppressWarnings("rawtypes") 
    ArrayList arrayOrder; 

    @SuppressWarnings("unchecked") 
    public CustomerCompartor(Integer[] arrayOrderInt) { 
     this.arrayOrder = new ArrayList(Arrays.asList(arrayOrderInt)); 

    } 

    public int compare(Customer cust1, Customer cust2) { 

     int cust1Order = this.arrayOrder.indexOf(cust1.getId()); 
     int cust2Order = this.arrayOrder.indexOf(cust2.getId()); 
     return cust1Order - cust2Order; 
    } 
} 

class Customer { 

    int id; 

    public Customer(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
} 

public class ArrayOrder { 
    public static void main(String[] args) { 
     List<Customer> customerArray = new ArrayList<Customer>(); 

     customerArray.add(new Customer(1)); 
     customerArray.add(new Customer(2)); 
     customerArray.add(new Customer(3)); 
     customerArray.add(new Customer(4)); 
     customerArray.add(new Customer(5)); 
     customerArray.add(new Customer(6)); 

     for (Customer cust : customerArray) { 
      System.out.println(cust.getId()); 
     } 

     Integer[] arrayOrder = new Integer[] { 3, 6, 4, 5, 1, 2 }; 

     CustomerCompartor comparator = new CustomerCompartor(arrayOrder); 
     Collections.sort(customerArray, comparator); 

     for (Customer cust : customerArray) { 
      System.out.println(cust.getId()); 
     } 

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