2012-06-02 29 views
0

我現在有兩組列,但我不確定如何對它進行編程以及我爲什麼使用它。兩者都在單獨的數組中。一個用於字母,另一個用於數字。按降序排列相應的值

a 12 
b 9 
c 156 

因此,一個對應於12和B對應於9等等等等的名單實際上是在文本文件中字母的頻率,所以我有他們的26。 兩者不在同一陣列中。因爲我有他們兩個分開的陣列。我想嘗試安排 ,並使它們以下降的方式。 使輸出將是:

c 156 
a 12 
b 9  

我仍然不確定的ArrayList或者HashMap的或樹地圖的各種能力。那麼對此有何幫助?

回答

1

您可以創建一個具有字符和頻率作爲數據成員的類,並使該類實現Comparable接口。

有2個選項在這裏,您可以:

從這個問題來看,這2個數據似乎並不是某個現有對象的成員。如果有機會,你不必爲角色和頻率創建一個新班級。您可以將現有對象插入List,實現在Comparator接口上擴展的類,並將ListCollections.sort(List<T> list, Comparator<? super T> c)分類。

+0

好吧,如果我使用SortedSet,如何將兩個數組添加到排序集? – nfnmy

+0

'set.add(alphabets,alphabetfrequency)'? – nfnmy

+0

@nfnmy:你需要創建一個包含字符和頻率的類。爲每個頻率條目創建這樣的對象,然後將它們插入到'TreeSet'中。 – nhahtdh

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

public class Test { 

    public static void main(String[] args) { 

     HashMap<String,Integer> map = new HashMap<String,Integer>(); 
     ValueComparator bvc = new ValueComparator(map); 
     TreeMap<String,Integer> sorted_map = new TreeMap(bvc); 

     map.put("A",5); 
     map.put("B",60); 
     map.put("C",65); 
     map.put("D",3); 

     System.out.println("unsorted map"); 
     for (String key : map.keySet()) { 
      System.out.println("key/value: " + key + "/"+map.get(key)); 
     } 

     sorted_map.putAll(map); 

     System.out.println("results"); 
     for (String key : sorted_map.keySet()) { 
      System.out.println("key/value: " + key + "/"+sorted_map.get(key)); 
     } 
    } 

} 

class ValueComparator implements Comparator { 

    Map base; 
    public ValueComparator(Map base) { 
     this.base = base; 
    } 

    public int compare(Object a, Object b) { 

    if((Integer)base.get(a) < (Integer)base.get(b)) { 
     return 1; 
    } else if((Integer)base.get(a) == (Integer)base.get(b)) { 
     return 0; 
    } else { 
     return -1; 
    } 
    } 
} 
0

試試這個:

public static void main(String[] args) throws Exception { 
    char[] letters = { 'a', 'b', 'c' }; 
    int[] numbers = { 12, 9, 156 }; 
    printDescendind(letters, numbers); 
} 

public static void printDescendind(char[] letters, int[] numbers) { 
    class Holder implements Comparable<Holder> { 
     char letter; 
     int number; 
     public int compareTo(Holder o) { 
      return number != o.number ? o.number - number : letter - o.letter; 
     } 
     public String toString() { 
      return String.format("%s %s", letter, number); 
     } 
    } 
    List<Holder> list = new ArrayList<Holder>(letters.length); 
    for (int i = 0; i < letters.length; i++) { 
     Holder h = new Holder(); 
     h.letter = letters[i]; 
     h.number = numbers[i]; 
     list.add(h); 
    } 
    Collections.sort(list); 
    for (Holder holder : list) { 
     System.out.println(holder); 
    } 
} 
1

您有以下兩個列表。

[a, b, c] 
[12, 9, 156] 

首先,拉鍊兩個列表一起,讓你得到的元組列表(或其投影)。

[(a, 12), (b, 9), (c, 156)] 

然後在每個元組秒項目,與任何訂購您想要對此列表進行排序

[(c, 156), (a, 12), (b, 1)] 

現在解壓這回兩個列表。

[c, a, b] 
[156, 12, 1] 

還有你的答案。

斜體字表示上述解決方案中使用的通用抽象,所有這些抽象可能已在this庫中可用。

+0

對於它的價值,使用上述方法的Haskell解決方案:http://ideone.com/XEzt7。 – missingfaktor