【问题标题】:How to order nodes in a tree based on their string data?如何根据字符串数据对树中的节点进行排序?
【发布时间】:2014-11-19 02:19:31
【问题描述】:

以下是我当前添加新节点的代码(在同一级别上)。这是添加newNode时需要修改以添加排序属性的代码部分。通俗的讲,当 newNode 前面的 String 数据大于 newNode 本身的 String 数据时,我需要在那个位置添加 newNode。

public void traverseRight(Node v, Node newNode) {
    if(v.getData().equals(newNode.getData())){
        System.out.println(v.getData() + " was already found in the tree under " + v.getParent().getData() + ".");
    }
    else if (hasRight(v)) {
        traverseRight(v.getRight(), newNode);
    }
    else {
        v.setRight(newNode);
        newNode.setParent(v.getParent());
    }
}

如果还有其他有用的东西,比如更多代码,我有很多可以解决的。

更新:好的,经过一个小时的节奏和一次 YouTube 搜索“java compareTo()”,这就是我想出的。为了提高可读性,我尝试添加一些简洁的 cmets。

对这种方法有什么意见吗?我是否忽略了任何事情或做某事不正确/效率低下?

public void traverseRight(Node v, Node newNode) {
    if(v.getData().equals(newNode.getData())){
        System.out.println(v.getData() + " was already found in the tree under " + v.getParent().getData() + ".");
    }
    else if(v.getData().compareToIgnoreCase(newNode.getData()) > 0){
        if(v.getParent().getLeft() == v){
            // MEANS V IS THE FIRST CHILD IN THIS STRUCTURE
            newNode.setParent(v.getParent());
            v.getParent().setLeft(newNode);
            newNode.setRight(v);
        }
        else{
            // V IS NOT THE FIRST CHILD, GUARANTEED TO HAVE A PREVIOUS NODE
            Node prev = getPrev(v.getParent().getLeft(), v);
            newNode.setParent(v.getParent());
            prev.setRight(newNode);
            newNode.setRight(v);
        }
    }
    else if (hasRight(v)) {
        traverseRight(v.getRight(), newNode);
    }
    else {
        // MEANS WE REACHED THE END OF THE STRUCTURE W/O A HIGHER VALUE THAN NEWNODE
        v.setRight(newNode);
        newNode.setParent(v.getParent());
    }
}

作为记录,它通过了我迄今为止运行的所有调试测试。这并不多,因为它只工作了大约 10 分钟,但到目前为止还不错。

再次感谢!

更新 #2: 排序末尾有多个数字的字符串时失败。 (例如 22 号航班)

如果我要输入航班 1、2、3 和 22,我的程序会返回:

航班 1 航班 2 22号班机 3号航班

不是世界末日,因为这只是一个家庭作业项目,但我不确定是否有人对此有任何快速修复。谢谢!

【问题讨论】:

  • 请编辑您的标签。 Node.js 与此无关。这是完全不同的事情。
  • 对不起,这就是我使用建议标签的结果!
  • 另外,欢迎来到 StackOverflow。发布一些正确缩进的代码而不是将其与您的文本结合起来很有用。请务必发布足够的代码,以便我们对您的问题有一个合理的理解。这将有助于让人们更好、更快地回答您的问题。
  • 谢谢您,感谢您的热烈欢迎,我采纳了您的明智建议,添加了一些(实际上清晰的)代码。

标签: java tree binary-tree


【解决方案1】:

你可以做的是让你的节点实现Comparable。在compareTo 方法中,您可以决定使用哪些字段进行比较(大于、小于或等于)。

public class Node implements Comparable<Node> {

    public int compareTo(Node otherNode) {
        return node.getName().compareTo(otherNode.getName());
    }

然后只需将您的节点添加到 &lt;Node&gt; 的 SortedSet 或 TreeMap。这些类将通过在您的节点上调用 compareTo() 方法为您进行排序。

您需要确保有 hashcode()equals() 方法来比较节点是否相等。这是使用集合的一般要求。

如果您已经需要检查节点是否存在,请将其作为单独的任务执行,然后再将值添加到 Sets to Maps。

if (set.contains(node)) {
    // your logic here
}

【讨论】:

  • 您好,感谢您对 SlipperySeal 的快速回复。不幸的是,在我在这里看到您的答案之前,我自己对该方法进行了一些重构。如果事实证明修改后的方法(我将在下面发布)不正确或效率低下,我肯定会考虑实现这个逻辑。再次感谢!
  • 请记住使用内置集合类有很多优点。当你对节点做更多的事情时,操作它们就容易多了。另外,不要担心效率。拥有干净、简单易懂的代码总是更好。事实上,java 集合类中的排序算法可能比你或我可能写的任何东西都要好:)
  • 是的,我很快意识到,当我在发布之前尝试创建自己的 compareTo() 方法(没有正当理由)时,哈哈。我能够以如此之快的速度掌握节点操作给我留下了深刻的印象,但肯定还有很多东西要学。
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2021-08-17
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多