将sortedSet转换为整数数组

时间:2014-02-25 23:36:13

标签: java sorting hashmap treeset

简介

首先,我想首先说我正在学习java,所以如果我在做任何低效或可以做得更好的事情,请告诉我。

我要做的是按键按字母顺序对HashMap进行排序,然后按顺序返回值列表。在谷歌搜索之后,我发现我可以使用SortedSet轻松地对HashMap进行排序,但后来我遇到了如何将树集合到数组中的问题?

示例

像这样的输入:

  

{“apple”,“pear”,“cherry”,“apple”,“cherry”,“pear”,“apple”,   “香蕉”}

应该返回:

  

{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());
    }
}

3 个答案:

答案 0 :(得分:3)

SortedSet extends Collection定义方法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()]);

但我建议你回一张地图。因为否则很难分辨哪些数字与哪个字符串相对应。

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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()]);
}