2014-02-25 33 views
1

介紹轉換一個SortedSet的一個整數數組

首先我想要說的是我學習java,所以如果在任何時候,我做的事情是低效或可以做更好的開始的,請告訴我。

我想要做的是按鍵按字母順序排序HashMap,然後按照該順序返回值列表。谷歌搜索後,我發現我可以使用SortedSet輕鬆地對HashMap進行排序,但是後來遇到了如何將樹設置爲數組的問題?

像這樣的輸入:

{ 「蘋果」, 「梨」, 「櫻花」, 「蘋果」, 「櫻花」, 「梨」, 「蘋果」 , 「香蕉」}

應該返回此:

{3 ,1,2,2}

我的代碼(到目前爲止)

import java.util.*; 

public class SortedFreqs { 
    public int[] freqs(String[] data) { 
     HashMap<String, Integer> myMap = new HashMap<String, Integer>(); 
     for (String s: data){ 
      if (!myMap.containsKey(s)){ 
       myMap.put(s, 0); 
      } 
     myMap.put(s, myMap.get(s)+1); 
     } 
    SortedSet<Integer> values = new TreeSet<Integer>(myMap.values()); 
    } 
} 
+0

是你的問題裁判。地圖或只顯示字數? –

+2

你想要一個像int []或ArrayList 這樣的數組嗎? – Leo

+0

[將集合轉換爲數組的最簡單方法]的可能重複(http:// stackoverflow。com/questions/3293946/the-easiest-way-to-transform-collection-to-array) – mdewitt

回答

3

SortedSet的延伸集合定義了方法toArray

Integer[] toArray = values.toArray(new Integer[values.size()]); 

然而,有一個問題這是該集合使用泛型,您的方法定義爲返回int[]的基本數組。有一個在這樣一個int[]轉換爲Integer[]沒有內置,所以你要麼需要自行更改方法簽名或者複製數組:

int[] primitives = new int[toArray.length]; 
for(int i = 0; i < toArray.length; i++) { 

    primitives[i] = toArray[i].intValue(); 
    // or just = toArray[i]; 
    // because intValue is called automagically by the compiler 
} 

雖然,其實,它看起來像在這裏你應該只返回地圖。如果要按字母順序返回,可以使用TreeMap而不是HashMap。

如果您真的想按照您在OP中描述的方式進行操作,您需要按鍵對值進行排序。問題是new TreeSet<Integer>(myMap.values())數字排序整數。所以你需要這樣做:

Collection<Integer> values = new TreeMap<String, Integer>(myMap).values(); 
Integer[] toArray = values.toArray(new Integer[values.size()]); 

但我建議返回一個地圖。因爲否則很難判斷哪些數字對應於哪個字符串。

0

解決它這樣,感謝您的意見和迴應。真的有幫助。

import java.util.*; 

public class SortedFreqs { 
    public int[] freqs(String[] data) { 
     int count = 0; 
     TreeMap<String, Integer> myMap = new TreeMap<String, Integer>(); 
     for (String s: data){ 
      if (!myMap.containsKey(s)){ 
       myMap.put(s, 0); 
       count++; 
      } 
     myMap.put(s, myMap.get(s)+1); 
     } 
    int [] ans = new int [count]; 
    int c = 0; 
    for (String i: myMap.keySet()){ 
     ans[c] = myMap.get(i); 
     c++; 
    } 
    return ans; 
    } 
} 
0
public static Integer[] freqs(String[] data) { 
    HashMap<String, Integer> myMap = new HashMap<String, Integer>(); 
    for (String s : data) { 
     if (!myMap.containsKey(s)) { 
      myMap.put(s, 0); 
     } 
     myMap.put(s, myMap.get(s) + 1); 
    } 
    return new TreeMap<String, Integer>(myMap).values().toArray(new Integer[myMap.size()]); 
} 
相關問題