- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想覆盖 System.out.println(map) 以打印不
{A=1, B=2, C=3,...}
但是
A 1
B 2
C 3
...
就像我在 MapManager 类的 readData 函数中所做的一样。
我从 AbstractMap
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/
我都见过,事实上,在观察后我并没有意识到有什么区别。但两者之间真的有什么区别 println(); // without quotation marks 和 println(""); // wi
当运行这个 java 程序时,我希望输出只是第一个 println,因为其他方法,quaffle 和 snitch 只返回整数。但是,该程序的输出还包括 quaffle 和 snitch 方法的 pr
我开始学习 jsp 并且我看到,如果我们想在 jsp 中打印一些东西,我们必须编写 out.println() 而不是 System.out.println() ,但是如果我们编写 System.ou
我刚刚写了这段代码: public class T { public String toString() { System.out.println("new line");
我一直在研究 Swift,刚刚遇到了一个问题。我有以下词典: var locations:Dictionary = ["current":CLLocationCoordinate2D(latitude
我有这个代码: System.err.print("number of terms = "); System.out.println(allTerms.size()); System.err
我一直在研究 Swift,刚刚遇到了一个问题。我有以下词典: var locations:Dictionary = ["current":CLLocationCoordinate2D(latitude
我无法解释竞争检测器中 println 和 fmt.Println 的不同输出。我希望两者都是种族,或者至少两者都不是种族。 package main var a int func f() {
我一直以为Predef.println只是 System.out.println 的快捷方式,但显然我错了,因为它似乎没有使用 System.out根本不。为什么会这样?我该如何“重定向” Syste
我有一个字符串数组: val str:Array[String] = Array("aa","bb") scala> str.foreach(println) // works aa bb scala
这个问题已经有答案了: Move console cursor to specified position (4 个回答) 已关闭 7 年前。 我正在使用简单的 println 行在 java 上工作
这是我现在正在做的一个简单测试用例的代码: private static final ByteArrayOutputStream OUTCONTENT = new ByteArrayOutputStr
public static void algorithmOne(int n){ long startTime = System.currentTimeMillis(); sea
我有以下代码: @Test public void testMultipleUpdatesSameTime() { final CyclicBarrier gate = new Cyc
我正在尝试创建一个可打印的命令提示板,以便在 CMD 中创建一个 TicTacToe 游戏。虽然,当我为我的董事会和我的单元格创建类(class)时,Java 在我的 print 和 println
我有 char c1 = 'S'; // S as a character char c2 = '\u0068'; // h in Unicode char c3 = 0
这是我的代码(golang) func main() { names := []string{"1", "2", "3"} for index, name := range names
来自 log.go (日志包的实现): 167 // Println calls l.Output to print to the logger. 168 // Arguments are handl
为什么我需要使用 System.out.println而不是 println当我使用 GroovyInterceptable ? 例如,如果我在 Groovy 文件中编码,我可以通过键入以下内容打印到
当我编写计算器应用程序时,我只是想不出最好的方法是什么: private void calculate(String command) { System.out.print("value1:
我是一名优秀的程序员,十分优秀!