Преобразование sortedSet в целочисленный массив

Введение

Прежде всего, я хочу начать с того, что я изучаю Java, поэтому, если в какой-то момент я делаю что-то неэффективное или можно было бы сделать лучше, дайте мне знать.

Я пытаюсь отсортировать HashMap в алфавитном порядке по ключу, а затем вернуть список значений в этом порядке. После поиска в Google я обнаружил, что могу легко отсортировать HashMap с помощью SortedSet, но затем я столкнулся с проблемой, как мне получить набор дерева в массив?

Пример

Такой ввод:

{"яблоко", "груша", "вишня", "яблоко", "вишня", "груша", "яблоко", "банан"}

Должно вернуть это:

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

person SpaceShroomies    schedule 25.02.2014    source источник
comment
Ваша проблема исх. на карту или только для отображения количества слов?   -  person Damian Leszczyński - Vash    schedule 26.02.2014
comment
вам нужен массив типа int[] или ArrayList‹Integer›?   -  person Leo    schedule 26.02.2014
comment
возможный дубликат Самый простой способ преобразовать коллекцию в массив?   -  person mdewitt    schedule 26.02.2014
comment
Если вы храните свои ключи в TreeMap вместо HashMap, они будут храниться в отсортированном порядке автоматически.   -  person mbroshi    schedule 26.02.2014


Ответы (2)


SortedSet расширяет коллекцию, которая определяет метод к массиву:

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()]);

Но я бы рекомендовал вернуть карту. Потому что иначе трудно сказать, какие числа соответствуют какой строке.

person Radiodef    schedule 25.02.2014

Решил так, спасибо за комментарии и ответы. Действительно помогло.

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;
    }
}
person SpaceShroomies    schedule 26.02.2014