如何 到 覆盖 系统输出打印(map)

kr98yfug  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(371)

我想 覆盖 系统输出打印(map) 到 不打印 

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

但是 

A 1
 B 2
 C 3
 ...

只是 喜欢 什么 我 有 完成 在里面 读取数据 功能 属于 Map管理器 班级。
我 有 建立 一些 代码 那个 能够 是 这个 暗示 对于 这个 解决方案 从 这个 定义 代码 属于 抽象Map 哪一个 是 扩展 通过 树形图<k,v> 和 工具 Map<k,v>in 这个 定义 属于 抽象Map, 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的 条目 在里面 这个 提升 秩序 属于 价值 和 这个 按字母顺序排列的 秩序 属于 钥匙, 所以 什么 我 希望 打印 到 做 是 什么 这个 下列的 说明如下:

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);
}

怎样 能够 我 做 过度缠绕 在里面 我的 代码 到 实现 这个?一 重要的 约束 是 那个 我 必须 不 修改 这个 代码 里面 公众的 班 问题{ }.
下面是我写的全部代码:

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);
    }
}
zlhcx6iw

zlhcx6iw1#

我不知道这个问题和你的课有什么关系 MapManager .
只是为了这个问题 how to override System.out.println(map) . 您可以覆盖 System.out .

public class Q65031068 {
  public static void main(String[] args) {
    Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 3);
    System.out.println(map);
    PrintStream out = System.out;
    System.setOut(new PrintStream(out) {
      @Override
      public void println(Object o) {
        if (o instanceof Map) {
          super.println(((Map<?, ?>) o).entrySet().stream()
            .map(e -> String.format("%s %s", e.getKey(), e.getValue()))
            .collect(Collectors.joining("\n")));
        } else {
          super.println(o);
        }
      }
    });
    System.out.println(map);
  }
}

输出:

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

yptwkmov2#

只需创建一个覆盖你的Map toString 方法。您可以将其分配给接口类型或 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);

相关问题