javaMaptostring()重写

db2dz4w8  于 2021-07-06  发布在  Java
关注(0)|答案(4)|浏览(492)
System.out.println(map);

所以结果是{a=2,b=4,c=5..},但我想要打印

A 2
B 4
C 5
...

所以,我的处理器的提示是map tosting()重写,但我不明白
这是我的密码

class MapManager2 {
public static Map<String, Double> readData(String fileName) {
    Map<String, Double> mapOfData;
    Map<String, Double> sortedByValue = null;

    try {
        Scanner file = new Scanner(new File(fileName)); // read file
        mapOfData = new TreeMap<>(); // create Map to store the values

        while (file.hasNextLine()) {
            String line = file.nextLine(); // read the line
            String[] words = line.split("\\s+"); // split the item and price by space
            Double price = Double.parseDouble(words[1]); // parse the double price
            mapOfData.put(words[0], price); // put the data in map
        }

        /* Sort the map on basis of value*/
        sortedByValue = mapOfData.entrySet()
                .stream().sorted((Map.Entry.<String, Double>comparingByValue()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
    } catch (FileNotFoundException e) {
        System.out.println("Input file not found");
    }
    return sortedByValue;
}

}
public class Problem21 {
public static void main(String[] args) {
    Map<String, Double> map = MapManager2.readData("input.txt");
    if (map == null) {
        System.out.println("Input file not found.");
        return;
    }
    System.out.println(map);
}

}

xfb7svmp

xfb7svmp1#

要重写tostring()方法,请扩展treemap类并用新类替换treemap示例。

import java.util.Map;
import java.util.TreeMap;

public class MyTreeMap extends TreeMap<String,Double> {
    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        this.entrySet().forEach(me -> {
            System.out.printf("%s %s%n", me.getKey(), me.getValue());
        });
        return result.toString();
    }
}
mctunoxg

mctunoxg2#

所以,我的处理器的提示是map tosting()重写,但我不明白
我不知道你的“处理器”是谁(教授?),但那是个愚蠢的暗示。
当你在子类化某些东西时,重写这些东西是有意义的。别给Map分类,那是。。。不是你想要的。
而不是把“Map”传给 System.out.println ,这将导致println调用 .toString() 在该对象上并打印生成的字符串,生成自己的字符串:

String print = map.entrySet().stream()
    // convert each element in the map to the string "KEY VALUE"
    .map(x -> x.getKey() + " " + x.getValue())
    // collect em by joining em, separating each "KEY VALUE" string with a newline
    .collect(Collectors.joining("\n"));
System.out.println(print);
5m1hhzi4

5m1hhzi43#

你的教授告诉你重写map类的tostring方法。我认为最好的办法是匿名覆盖。

Map<String, String> test = new HashMap<>() {
    @Override
    public String toString() {
        StringBuilder stb = new StringBuilder();
        for (Map.Entry<String, String> entry : this.entrySet()) {
            stb.append(entry.getKey()).append(" ")
                    .append(entry.getValue()).append("\n");
        }
        return stb.toString();
    }
};

请注意,我现在没有任何方法检查此代码是否有错误,因此您可能需要修复一些名称。

5m1hhzi4

5m1hhzi44#

我不知道你所说的“处理器的提示”是什么意思,但你真的不需要重写 toString . 更简单的方法是将Map转换为所需的字符串:

map.entrySet().stream()
    .map(e -> e.getKey() + " " + e.getValue())
    .collect(Collectors.joining("\n"));

或者如果您只想直接打印Map:

map.forEach((k, v) -> System.out.println(k + " " + v));

相关问题