【问题标题】:Converting a sortedSet to an Integer Array将 sortedSet 转换为整数数组
【发布时间】:2014-02-25 23:36:13
【问题描述】:

简介

首先我想说我正在学习 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());
    }
}

【问题讨论】:

  • 是你的问题参考。映射或仅显示字数?
  • 你想要像 int[] 这样的数组还是 ArrayList
  • 如果您将密钥存储在 TreeMap 而不是 HashMap 中,它们将自动按排序顺序存储。

标签: java sorting hashmap treeset


【解决方案1】:

SortedSet 扩展了 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&lt;Integer&gt;(myMap.values()) 对整数进行数字排序。因此,您需要执行以下操作:

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

但我建议返回地图。因为否则很难分辨出哪个数字对应哪个字符串。

【讨论】:

    【解决方案2】:

    这样解决了,感谢cmets和回复。真的很有帮助。

    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;
        }
    }
    

    【讨论】:

      【解决方案3】:
      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()]);
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 2016-01-03
        相关资源
        最近更新 更多