如果键的长度相等,如何按树状图键的长度排序?按字母顺序将其写入文本文件

时间:2019-02-04 12:04:59

标签: java dictionary treemap

我在继续操作时遇到问题,有人可以帮忙编写代码吗?

让我也了解基本概念...

readfile data => IBARAKI MitoCity
             TOCHIGI UtunomiyaCity
             GUNMA MaehashiCity
             SAITAMA SaitamaCity
             CHIBA ChibaCity
             TOKYO Sinjyuku
             KANAGAWA YokohamaCity
write text file output => CHIBA : ChibaCity
                     GUNMA : MaehashiCity
                     TOKYO : Sinjyuku
                     IBARAKI : MitoCity
                     SAITAMA : SaitamaCity
                     TOCHIGI : UtunomiyaCity
                     KANAGAWA : YokohamaCity

代码

import java.util.*;
import java.io.*;
public class ReadFileDemo{
public static void main(String[] args) throws IOException {
    Reader reader = new InputStreamReader(new 
    FileInputStream(args[0]),"UTF-8");
    BufferedReader br = new BufferedReader(reader);
    Writer writer = new OutputStreamWriter(new 
    FileOutputStream("textB.txt"),"UTF-8");
    BufferedWriter bw = new BufferedWriter(writer);        
    Map<String,String> map = new HashMap<String,String>();

    String line=null;
    while((line=br.readLine())!=null) {
     String[] parts = line.split(" ");
     String key=parts[0];
          String value=parts[1];
          map.put(key,value);
    }

    Map<String, String> treemap = new TreeMap<String, String>(map);

   }
}

谢谢!

3 个答案:

答案 0 :(得分:0)

创建一个键列表(或使用地图的keySet),然后编写自己的Comparator对列表进行排序,然后遍历已排序的列表以创建输出文件。

比较器可能看起来像这样:

public class Cmp1 implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        if(o1.length() == o2.length()) {
            //String's own comparator, which is alphabetical
            return o1.compareTo(o2);
        }
        //otherwise compare the length
        return o2.length() - o1.length();
    }
}

编辑: 或者,如其他答案所指出的那样,将该比较器传递给树形图的构造函数。

答案 1 :(得分:0)

您必须为TreeMap提供自己的比较器:

Map<String, String> treemap = new TreeMap<>(myComparator);

然后将所有元素添加到新的TreeMap中:

treemap.addAll(map);

或更妙的是,首先将TreeMap用于变量map。因此,不必将map的内容复制到新的TreeMap

制作比较器的一种简单方法是使用类java.util.Comparator中的函数:

Comparator<String> myComparator = comparingInt(String::length).thenComparing(naturalOrder());

答案 2 :(得分:0)

Java TreeMap具有构造函数new TreeMap(Comparator<? super K>)。因此,您可以按照自己的意愿通过TreeMap实例化Comparator并将其直接放在此TreeMap上。在此Map的EntrySet上进行迭代时,元素将按照所需的顺序排列。

您的Java-8功能样式的比较器可以写为

Comparator.comparing(String::length).thenComparing(String::compareTo);