gpt4 book ai didi

java - 如何覆盖 System.out.println(map)

转载 作者:行者123 更新时间:2023-12-04 02:29:42 24 4
gpt4 key购买 nike

我想覆盖 System.out.println(map) 以打印不

{A=1, B=2, C=3,...}

但是

 A 1
B 2
C 3
...

就像我在 MapManager 类的 readData 函数中所做的一样。

我从 AbstractMap 的定义代码中找到了一些代码,这些代码可能是解决方案的提示,它由 TreeMap 扩展并实现了 Map 在 AbstractMap 的定义中,toString() 的实现方式如下:

 public String toString() {
        Iterator<Entry<K,V>> i = entrySet().iterator();
if (! i.hasNext())
 return "{}";
StringBuilder sb = new StringBuilder();
sb.append('{'); 
for (;;) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
sb.append(key   == this ? "(this Map)" : key); 
sb.append('=');
sb.append(value == this ? "(this Map)" : value);
if (! i.hasNext()) return sb.append('}').toString();
sb.append(',').append(' ');
 }
}

如果我要修改此代码以使其按照我的意图执行,它会像这样:

public String toString() {
Iterator<Entry<K,V>> i = entrySet().iterator();
if (! i.hasNext())return "{}";
StringBuilder sb = new StringBuilder(); 
sb.append('{');
for (;;) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();sb.append(key   == this ? "(this Map)" : key);
sb.append(' ');  //whitespace instead of ‘=’
sb.append(value == this ? "(this Map)" : value);
if (! i.hasNext())return sb.toString();// make sb into String without appending anything.
sb.append('\n'); //append newline instead of ‘,’ and ‘ ’
}
}

但是 添加到此,我想以值的升序和键的字母顺序打印 map 的条目,所以我想要 println 做什么是以下指令的作用:

set = box.entrySet();
list = new ArrayList<>(set);
Collections.sort(list, new ValueComparator<Map.Entry<String, Double>>());

Iterator<Map.Entry<String, Double>> it = list.iterator();
while(it.hasNext()) {
Map.Entry<String, Double> entry = it.next();
double value = entry.getValue().doubleValue();
System.out.println(entry.getKey() + " " + value);
}

我怎样才能在我的代码中进行重写来实现这一点?一个重要的约束是我不得修改公共(public)类问题{ }中的代码。

下面是我写的全部代码:

import java.util.*;
import java.util.Map.Entry;
import java.io.*;

class MapManager{
private static BufferedReader br;
private static Set<Map.Entry<String, Double>> set;
private static List<Map.Entry<String, Double>> list;

static class ValueComparator<T> implements Comparator<T>{
public int compare(Object o1, Object o2) {
if(o1 instanceof Map.Entry && o2 instanceof Map.Entry) {
Map.Entry<String, Double> e1 = (Map.Entry<String, Double>) o1;
Map.Entry<String, Double> e2 = (Map.Entry<String, Double>) o2;
double v1 = e1.getValue().doubleValue();
double v2 = e2.getValue().doubleValue();
return (int)(v1 - v2);
}
return -1;
}
}

public static TreeMap<String, Double> readData(String fn){
TreeMap<String, Double> box = new TreeMap<>();
int data = 0, i = 0, j = 0, digits = 0, points = 0;
String buffer = " ";
String name = " ";
String price = " ";

(omitted)

set = box.entrySet();
list = new ArrayList<>(set);
Collections.sort(list, new ValueComparator<Map.Entry<String, Double>>());

Iterator<Map.Entry<String, Double>> it = list.iterator();
while(it.hasNext()) {
Map.Entry<String, Double> entry = it.next();
double value = entry.getValue().doubleValue();
System.out.println(entry.getKey() + " " + value);
}

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

最佳答案

只需使用覆盖的 toString 方法创建您的 map 。您可以将其分配给接口(interface)类型或 TreeMap 类型。

Map<String,Double> map = new TreeMap<>() {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Entry<?,?> e : this.entrySet()) {
sb.append(String.format("%s %s%n", e.getKey(), e.getValue()));
}
return sb.toString();
}
};


map.put("A",1.0);
map.put("B",2.0);
map.put("C",3.0);

System.out.println(map);

打印

A 1.0
B 2.0
C 3.0

另一个建议。如果您必须编写自己的比较器,则不要这样做。

 return (int)(v1 - v2);

这是糟糕的形式。花点时间返回 -1、1 或 0。您可以使用三元运算符 (?:) 轻松完成此操作。

 return v1 > v2 ? 1 : v1 < v2 ? -1 : 0;

但更好的方法是使用 Map.Entry 类提供的比较器。

Comparator<Entry<String,Double>> valueComparator = Entry.comparingByValue();
Collections.sort(List, valueComparator);


关于java - 如何覆盖 System.out.println(map),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65031068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com