当前位置: 首页 > 知识库问答 >
问题:

Java按有序值打印树状图

钱劲
2023-03-14

我正在编写一个程序,将足球队的数据存储在嵌套的树形图中。看起来是这样的:

TreeMap<[team name], TreeMap<[team wins], [opponents]>>

其中,[team name]和[Operators]是字符串,[team wins]是int。我当前的目标是按团队胜利的降序打印数据。它必须看起来像:

Liverpool: //map key
wins: <wins>  //nested map key
opponents: <opponents> 

我的想法是对嵌套的map entrySet()进行排序,然后在打印数据时对其进行迭代,但我做不到这一点,因为从我读到的内容来看,我需要TreeSet和map。entry()返回刚设置好的值。我需要我的地图是树形图,因为当两支球队取得相等的胜利时,我需要按字母顺序打印。如果我不清楚的话,打印一个按嵌套树映射键排序的树映射的好方法是什么?

共有2个答案

曾云
2023-03-14

我会创建一个TreeMap

编辑:由于键不能是唯一的,另一个解决方案是使用自己的比较器创建一个成对的树集,当键相等时,它会比较值。然后你会得到这样的结果:

TreeSet<Pair<String,Pair<Integer,String>>> sortedSet = new TreeSet(new Comparator<Pair<String,Pair<Integer,String>>>() {
    @Override
    public int compare(Pair<String,Pair<Integer,String>> a, Pair<String,Pair<Integer,String>> b) {
        int res = b.getValue().getKey() - a.getValue().getKey();
        if (res == 0) {
            return a.getKey().compareTo(b.getKey());
        } else {
            return res;
        }
    }
});
teams.forEach(new BiConsumer<String,Pair<Integer,String>>() {
    @Override
    public void accept(String k, Pair<Integer,String> v) {
        sortedSet.add(new Pair(k, v));
    }
});

顺便说一下,我改变了你的初始数据结构,因为你声明团队只有一个获胜值,这意味着嵌套的树状图总是只有一个条目,因此应该是一对。

边健
2023-03-14

TreeMap(如文档所述)自然地按您使用的键进行排序。所以,如果你想按赢的次数打印数据,那么你需要把赢的次数作为你的主键。

因为您希望次要排序基于团队名称,所以您希望这是您的次要密钥。

因此TreeMap

此外,由于对手可能意味着不止一个对手,因此您可能希望将其稍微复杂一点,并在需要时将其更改为以下内容:

树图

希望这能为你指明正确的方向。请记住,在您的情况下,外部树形图的自然顺序是降序,即[wins]的顺序,因此请确保Compariable的Comparieto功能执行正确的操作。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;
import java.util.TreeMap;

public class SO36799415 {

    public static Random random = new Random();

    public static void main(String[] args) {
        TreeMap<Integer, TreeMap<String, ArrayList<String>>> map = new TreeMap(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return -Integer.compare(o1, o2);
            }
        });
        int teams = random.nextInt(20) + 1;
        for (int i = 0; i < teams; i++) {
            addToMap(map);
        }
        for (Integer wins : map.keySet()) {
            TreeMap<String, ArrayList<String>> tmp = map.get(wins);
            for (String team : tmp.keySet()) {
                System.out.println(team);
                System.out.println("Wins: " + wins);
                System.out.println(tmp.get(team));
                System.out.println();
            }
        }
    }

    private static void addToMap(TreeMap<Integer, TreeMap<String, ArrayList<String>>> map) {
        String name = randomName();
        int wins = random.nextInt(10);
        int opponents = random.nextInt(10) + 1;
        Team team = new Team(name);
        team.setWins(wins);
        for (int i = 0; i < opponents; i++) {
            team.addOpponent(randomName());
        }
        if (map.containsKey(wins)) {
            map.get(wins).put(name, team.opponents);
        } else {
            TreeMap<String, ArrayList<String>> tmp = new TreeMap<>();
            tmp.put(name, team.opponents);
            map.put(wins, tmp);
        }
    }

    private static String randomName() {
        StringBuffer sb = new StringBuffer();
        int len = random.nextInt(10) + 1;
        for (int i = 0; i < len; i++) {
            sb.append((char) ('a' + random.nextInt(26)));
        }
        return sb.toString();
    }

    private static class Team {
        String name;
        ArrayList<String> opponents;
        int wins;

        public Team(String name) {
            this.name = name;
            this.opponents = new ArrayList<>();
            this.wins = 0;
        }

        public boolean addOpponent(String opponent) {
            return this.opponents.add(opponent);
        }

        public void setWins(int wins) {
            this.wins = wins;
        }
    }
}

 类似资料:
  • NowCoder 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 解题思路 // java public ArrayList<arraylist> Print(TreeNode pRoot) { ArrayList<arraylist> ret = new ArrayList<>()

  • 一、题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。 二、解题思路 按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前

  • 本文向大家介绍C程序打印所有ASCII值。,包括了C程序打印所有ASCII值。的使用技巧和注意事项,需要的朋友参考一下 问题 打印0到255个字符的美国信息交换标准代码(ASCII)值,而无需将该字符初始化为整数类型变量。只需使用格式说明符。 解决方案 在这里,我们正在编写一个程序,仅打印65到122。 如果要查看所有ASCII值,则在for循环中可以编写如下: 然后,它打印从0到255的所有AS

  • 问题内容: 如何在Java中打印二进制树,使输出类似于: 我的节点: 问题答案: 我已经创建了简单的二叉树打印机。你可以根据需要使用和修改它,但是仍然没有对其进行优化。我认为很多事情可以在这里得到改善;) 输出1: 输出2:

  • 我试图创建一个实现,其中多个线程打印序列的备用值。这里thread1将打印1,4,7 thread2将打印2,5,8 thread3将打印3,6,9。我用的是原子整数和模函数。 下面的实现可以很好地工作,第一个线程打印1,4,7,第二个线程打印2,5,8,第三个线程打印3,6,9,但问题是没有保持顺序,即输出可能类似于1,3,2,4,5,7,8,6,9,而我希望保持顺序,因为正确的线程可以打印这些

  • 我必须打印一个目录树(像树命令),示例: 我尝试使用以下代码: 我试了几个版本,但还是不行。这怎么做?如果是什么条件?我知道很简单,但我做不到。