2012-01-08 22 views
2

我有兩個數組:如何使用各自的數組ID或值對數組進行排序?

String [] ids= new String [5]; 
String [] points= new String [5]; 

String one="a,b,c,d,e"; 
//or 
String one="nepal,japan,finland ,brazil,spain"; 
String two="100,500,200,400,300"; 
ids= one.split(","); 
points= two.split(","); 

現在我想在降序排序points就像。

500,400,300,200,100 with respective ids b,d,e,c,a 

我該怎麼做。

但我嘗試這個降序順序,這是好的,但如何訂購ids與各自的ID。

Arrays.sort(points, Collections.reverseOrder()); 
Arrays.toString(points); 

Arrays.sort(points); 

如果我這樣做相同的id其也下降。但不是輸出。

被修改:

如果我有取代

A,B,C,d,電子信contries命名或時間。

String one="a,b,c,d,e"; 
// or 
String countries = "nepal,japan,finland,brazil,spain"; 
// or 
String time="0:10,1:25,4:00,2:10,0:55"; 
+0

誰投這個票;既然你顯然理解這個問題,你能解釋一下嗎? – 2012-01-08 06:25:13

+0

@BrianRoach他想要對一個數組進行排序,並在完成時按相同的順序再次創建另一個相同大小的數組。 – bdares 2012-01-08 06:27:17

+0

是否映射選項? – CppLearner 2012-01-08 06:28:14

回答

2

您可以定義自己的Comparator,這樣的事情:

import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 

public class CustomArrayComparator implements Comparator<String> 
{ 
    private String[] pointsArray; 
    private Map<String, Integer> idsMap; 

    public CustomArrayComparator(String[] pointsArray, String[] countriesArray) 
    { 
     this.pointsArray = pointsArray; 
     idsMap = new HashMap<String, Integer>(); 
     for(int i = 0; i < pointsArray.length; i++) idsMap.put(countriesArray[i], i); 
    } 

    @Override 
    public int compare(String s1, String s2) 
    { 
     return pointsArray[idsMap.get(s2)].compareTo(pointsArray[idsMap.get(s1)]); 
    } 
} 

,這裏是主要的:

String[] points = {"100", "500", "200", "400", "300"}; 
String[] countries = {"nepal", "japan", "finland", "brazil", "spain"}; 
CustomArrayComparator comparator = new CustomArrayComparator(points, countries); 
Arrays.sort(countries, comparator); 
Arrays.sort(points, Collections.reverseOrder()); 

System.out.println(Arrays.toString(points)); 
System.out.println(Arrays.toString(countries)); 

OUTPUT:

[500, 400, 300, 200, 100] 
[japan, brazil, spain, finland, nepal] 

編輯:

作爲一般類,這裏是同一類通用的實現:

import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 

public class CustomArrayComparator<T extends Comparable<T>, E> implements Comparator<T> 
{ 
    private T[] mainArray; 
    private Map<E, Integer> indexesMap; 

    public CustomArrayComparator(T[] mainArray, E[] associatedArray) 
    { 
     this.mainArray = mainArray; 
     indexesMap = new HashMap<E, Integer>(); 
     for(int i = 0; i < mainArray.length; i++) 
     { 
      indexesMap.put(associatedArray[i], i); 
     } 
    } 

    @Override 
    public int compare(T t1, T t2) 
    { 
     return mainArray[indexesMap.get(t2)].compareTo(mainArray[indexesMap.get(t1)]); 
    } 
} 

主要:

String[] points = {"100", "500", "200", "400", "300"}; 
String[] countries = {"nepal", "japan", "finland", "brazil", "spain"}; 
Comparator<String> comparator = new CustomArrayComparator<String, String>(points, countries); 
Arrays.sort(countries, comparator); 
Arrays.sort(points, Collections.reverseOrder()); 

System.out.println(Arrays.toString(points)); 
System.out.println(Arrays.toString(countries)); 

OUTPUT:

[500, 400, 300, 200, 100] 
[japan, brazil, spain, finland, nepal] 
+0

不錯吧....如果我把ids數組替換成美國,印度,日本,芬蘭,德國那麼該怎麼辦?我是對的,將createCharacterArray()重新創建爲createStringArray()。 – 2012-01-08 07:03:32

+0

工作等待評論, – 2012-01-08 07:28:20

+0

@KshetriHorrorgoogle查看更新請:) – 2012-01-08 07:30:34

2

Arrays.sort()將只對您給它的一個數組排序。我將創建一個既有id也有point字段的類,該類的數組(或集合),並對該數組進行排序。您還必須實施comparable

或者,您可以在兩個數組之間進行映射。排序points陣列,然後重新排序ids陣列以匹配映射。 (這是稍貴,但可能更容易理解。)

+0

就我個人而言,我認爲前者更容易理解,如果你根本不瞭解OOP。 – 2012-01-08 06:31:35

+0

謝謝你,這也有幫助。 – 2012-01-08 08:08:11

1

是自定義類(或東西一般像一對< T1,T2 >並定義排序由第一個值的比較器。然後,你可以做陣列。排序(arrayOfPairs,pairComparator)

+0

謝謝你,這也有幫助。 – 2012-01-08 08:07:53