我如何将树地图放入键和值分类为上升列表中



,因此此程序给出了每个单词的custcurences。我需要用这些数据列出以上升序排列这些单词的列表。

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

实现比较器接口,并在Java中覆盖其比较方法。在集合中获取Map.Entryset(),将其转换为列表(我们已将设置转换为列表,因为Collections的Sort方法只能接受列表类型作为参数)。致电collections.sort和通过列表[即listofentryset]作为参数。collections.Sort内部调用arrays.sort,arrays.sort.sort()内部调用合并sort.merge sort called calldide比较比较键的比较方法以进行比较。Java。

它是一个简单的Google搜索,但您是:

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

如果我正确理解了您的要求,因为您不能让您对这样的值进行分类:

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

最新更新