如何将键和值的树图放入升序列表中?

问题描述:

所以这个程序给出了每个单词的出现次数。我需要将这些数据按升序排序。如何将键和值的树图放入升序列表中?

import java.util.*; 

public class A1E5{ 
    public static void main(String[] args) { 
    // Set text in a string 
    String text = "Good morning. Have a good class. " + 
     "Have a good visit. Have fun!"; 

    // Create a TreeMap to hold words as key and count as value 
    Map<String, Integer> map = new TreeMap<>(); 

    String[] words = text.split("[\\s+\\p{P}]"); 
    for (int i = 0; i < words.length; i++) { 
     String key = words[i].toLowerCase(); 

     if (key.length() > 0) { 
     if (!map.containsKey(key)) { 
      map.put(key, 1); 
     } 
     else { 
      int value = map.get(key); 
      value++; 
      map.put(key, value); 
     } 
     } 
    } 

    // Display key and value for each entry 
    map.forEach((k, v) -> System.out.println(k + "\t" + v)); 
    } 
} 
+1

预期输入/输出? – shmosel

+1

按什么排序?这个单词?你的代码已经做到了。 – shmosel

实现Comparator接口并覆盖它在java中的比较方法。 在集合中获取map.entrySet(),将其转换为列表(由于集合的排序方法只能接受列表类型作为参数,所以我们已将集合转换为列表)。 调用Collections.sort和传递列表[即listOfentrySet]作为参数。 Collections.sort在内部调用Arrays.sort,Arrays.Sort()内部调用合并Sort.Merge排序调用覆盖Comparator接口的比较方法以比较键。非常紧密的listOfentrySet将包含基于键排序的条目(键值)对在Java中。

它是一种简单的谷歌搜索,但在这里,你是:

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Set; 



class SortByKeyAscending implements Comparator<Map.Entry<Integer, Integer>>{ 

@Override 
public int compare(Map.Entry<Integer,Integer> entry1, Map.Entry<Integer,Integer> entry2){ 
    return (entry1.getKey()).compareTo(entry2.getKey()); 
    } 
} 



public class SortMapByKeyAscendingExample { 

public static void main(String...a){ 
    Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>(); 
    map.put(4, 1); 
    map.put(2, 1); 
    map.put(3, 1); 
    map.put(5, 1); 

    Set<Entry<Integer, Integer>> entrySet = map.entrySet(); 
    List<Entry<Integer, Integer>> listOfentrySet = new ArrayList<Entry<Integer, Integer>>(entrySet); 

    System.out.print("Before sorting by key : "); 
    for(Map.Entry<Integer, Integer> entry:listOfentrySet){ 
    System.out.print(entry.getKey()+"="+entry.getValue()+" "); 
    } 

    Collections.sort(listOfentrySet, new SortByKeyAscending()); 


    System.out.print("\nAfter sorting by key(ascending): "); 
    for(Map.Entry<Integer, Integer> entry:listOfentrySet) 
    System.out.print(entry.getKey()+"="+entry.getValue()+" "); 


    } 
} 

输出将是(键值)

之前排序:4 = 1 2 = 1 3 = 1 5 = 1

分拣后:2 = 1 3 = 1 4 = 1 5 = 1

如果我理解正确的话你的要求,因为你不能有一个TreeMap排序本身就值你想要的东西是这样的:

List<String> wordsList = new ArrayList<String>(); 
map.forEach((k, v) -> wordsList.add(k)); 
System.out.println(Arrays.toString(wordsList.toArray())); 

输出:

[a, class, fun, good, have, morning, visit] 

或者这样:

List<String> wordsList = new ArrayList<String>(); 
for(Map.Entry<String, Integer> entry : map.entrySet()) { 
    String key = entry.getKey(); 
    for(int i = 0 ; i <= entry.getValue(); i++) { 
    wordsList.add(key); 
    } 
} 
System.out.println(Arrays.toString(wordsList.toArray())); 

输出:

[a, a, a, class, class, fun, fun, good, good, good, good, have, have, have, have, morning, morning, visit, visit] 

如果你想打印出来的效果由数排序,你可以这样做:

map.entrySet() 
     .stream() 
     .sorted(Map.Entry.comparingByValue()) 
     .forEach(e -> System.out.println(e.getKey() + "\t" + e.getValue())); 

您还可以使用流产生在首位的频率图:

Pattern.compile("[\\s+\\p{P}]") 
     .splitAsStream(text) 
     .map(String::toLowerCase) 
     .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
     .entrySet() 
     .stream() 
     .sorted(Map.Entry.comparingByValue()) 
     .forEach(e -> System.out.println(e.getKey() + "\t" + e.getValue())); 
+0

OP对他所要的词语排序不明确,但如果我错了,请纠正我的错误,他是否说他希望将输出作为列表? – shash678

+1

@ shash678如果是这样,他并没有试图做到这一点。我的解释是他想把它们打印成列表。 – shmosel