2016-02-22 9 views
0

Я довольно новичок в TreeMap и TreeSet и понравился и задавался вопросом, как сортировать структуры данных по стоимости? Я понимаю, что с TreeSet вы можете сортировать его в алфавитном порядке автоматически, но я хочу, чтобы он заказывал через значение? Любая идея о том, как это сделать?Как сортировать TreeSet по стоимости?

В настоящее время он печатает как ...

  • ааа: 29
  • aaahealthart: 30
  • аб: 23
  • аббатство: 14
  • abdomin: 3
  • Aberdeen: 29
  • aberdeenuni: 20

Когда я хочу, чтобы напечатать как ...

  • aaahealthart: 30
  • ааа: 29
  • Aberdeen: 29
  • аб: 23
  • aberdeenuni: 20
  • аббатство: 14
  • abdomin: 3

Вот мой метод здесь ...

ArrayList<String> fullBagOfWords = new ArrayList<String>(); 
public Map<String, Integer> frequencyOne; 

public void termFrequency() throws FileNotFoundException{ 
    Collections.sort(fullBagOfWords); 
    Set<String> unique = new TreeSet<String>(fullBagOfWords); 
    PrintWriter pw = new PrintWriter(new FileOutputStream(frequencyFile)); 
    pw.println("Words in Tweets : Frequency of Words"); 
    for (String key : unique) { 
     int frequency = Collections.frequency(fullBagOfWords, key); 

     System.out.println(key + ": " + frequency); 
     pw.println(key + ": " + frequency); 
     } 
    pw.close(); 
    } 

Спасибо за помощь, ребята.

+0

Вы не можете. Используйте HashMap для хранения слов и их частоты, затем преобразуйте карту в список и отсортируйте этот список по значению. –

ответ

1

TreeMap заказы по ключу, я не думаю, что вы можете использовать ту же реализацию для сортировки по значению. Но вы можете решить эту задачу с помощью немного другого подхода:

Тогда вам просто нужно отсортировать элементы результирующей карты. Вы можете сделать это следующим образом:

public List<Map.Entry<String, Integer> sortMap(Map<String, Integer> map) { 
    List<Map.Entry<String, Integer> elements = new LinkedList<>(map.entrySet()); 
    Collections.sort(elements, new Comparator<Map.Entry<String, Integer>>() { 

     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 

    }); 
} 

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

+0

@ и как мне совместить два? Я просто называю 'result' внутри метода sortMap()? –

+0

@JohnLewis Да, вам нужно взять результат из метода countWords() 'и передать его как аргумент методу' sortMap() '. –

+0

@ Danial Alexiev - я не думаю, что слова count работают правильно, так как я замечаю, что число слов выше, чем появляются слова? –

1

попробовать что-то вроде этого:

Создать Comparator:

class EntryComparator implements Comparator<Map.Entry<String,Integer>>{ 
    public int compare(Map.Entry<String,Integer> first, Map.Entry<String,Integer> second) { 
     return first.getValue().compareTo(second.getValue) 
    } 

    public boolean equals(Map.Entry<String,Integer> that) { 
     return this.equals(that); 
    } 
} 

Используйте его, чтобы отсортировать записи:

Set<Map.Entry<String,Integer>> sorted = 
    new TreeSet<Map.Entry<String,Integer>>(frequencyOne.entrySet(), new EntryComparator()); 

Это должно дать вам то, что вы хотите.

1

Вы можете создать ArrayList и хранить каждую запись в нем, как это:

ArrayList<Map.Entry<String, Integer> list = new new ArrayList(map.entrySet()); 

, то вы можете сортировать ArrayList с помощью компаратора, который сравнивает данные по их стоимости:

Collections.sort(list , new Comparator<Map.Entry<String, Integer>>() { 

     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 

    }); 

И то вы можете распечатать записи из массиваList