System.out.println(map);
so result is {A=2, B=4, C=5..} but i want print
A 2
B 4
C 5
...
So, my processor's hint is map toSting() override, but i don't understand
this is my code
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);
}
}
Your prof is telling you to override the toString method of the Map class. I think the best idea is an anonymous override.
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();
}
};
Note that I don't have any way to chexk this code for errors right now, so you may have to fix some names.
I'm not sure what you mean by "processor's hint" but you don't really need to override toString
. Simpler is to just convert the map to the string you want:
map.entrySet().stream()
.map(e -> e.getKey() + " " + e.getValue())
.collect(Collectors.joining("\n"));
Or if you just want to print the map directly:
map.forEach((k, v) -> System.out.println(k + " " + v));
So, my processor's hint is map toSting() override, but i don't understand
I don't know who your 'processor' is (professor?), but that's a dumb hint.
overriding things makes sense when you're subclassing something. Don't subclass map, that's... not what you want.
instead of passing 'map' to System.out.println
, which will result in println invoking .toString()
on that object and printing the resulting string, make your own string:
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);
To override the toString() method, extend TreeMap class and replace your TreeMap instance with new class.
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();
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.