0

好的,所以我的思维方式又出现了一些问题(这次我病了)。我需要将一个 .txt 文件实现到一个 2-3 树中,我已经为此奠定了基础。

我的节点类

package kth.id2010.lab.lab04;

public class Node {
    boolean isLeaf = false; 
    int numberOfKeys;
    String[] keys = new String[2]; //each node can contain up to 2 keys
    int[] key1Values = new int[2]; //every key contains 2 values
    int[] key2Values = new int[2]; //every key contains 2 values
    Node[] subtrees = new Node[3]; //every node can contain pointers to 3 different nodes
    Node[] parent = new Node[1]; //every node contains a pointer to a parent node, if root parent      is null

    Node(Node n) {
        n.numberOfKeys = 0;
        n.isLeaf = true;
    }
}

我的树班

package kth.id2010.lab.lab04;

public class Tree {

    Node root; // root node of the tree
    int n; // number of elements in the tree

    private Tree(){
        root = new Node(root);
        n = 0;
        root.parent = null;
    }
    //Return the values of the key if we find it
    public int[] get(Node n, String key){
        if(n.isLeaf){
            if(n.keys[0].equals(key)){
                return(n.key1Values);
            }
            else if(n.keys[1].equals(key)){
                return(n.key2Values);
            }
            else{
                return null;
            }
        }
        else if(key.length() < n.keys[0].length()){
            return(get(n.subtrees[0],key));
        }
        else if(n.numberOfKeys == 2 && key.length() < n.keys[1].length()){
            return(get(n.subtrees[1],key));
        }
        else{
            return(get(n.subtrees[2],key));
        }
    }
    //put new values to the key
    public void put(Node n, int[] value, String key){
        if(n.keys[0].equals(key)){
            n.key1Values = value;
        }
        else if(n.keys[1].equals(key)){
            n.key2Values = value;
        }
        else if(n.keys[0].length() < key.length()){
            put(n.subtrees[0],value,key);
        }
        else if(n.numberOfKeys == 2 && n.keys[1].length() < key.length()){
            put(n.subtrees[1],value,key);
        }
        else{
            put(n.subtrees[2],value,key);
        }
    }

    public int size(){
        return(this.n);
    }
}

还有我的司机课

package kth.id2010.lab.lab04;


import edu.princeton.cs.introcs.In;
import java.net.URL;

public class Driver {

    public static void main(String[] args) {
        URL url = Driver.class.getResource("/kap1.txt");
        System.out.println(System.getProperty("user.dir"));
        In input = new In(url);
        String[] usedWords;

        while(!input.isEmpty()){
            String line = input.readLine().trim();
            String[] words = line.split(" ");
            for (String word : words) {
                System.out.println(word);
            }
        }

    }
}

因此,对于我的分配,每个单词words都是 1 个键,keyValue1[0]出现次数 = 索引,words并且keyValue1[1]是出现次数。所以我的想法是,对于 in 中的每个单词,words我将它添加到一个节点并将索引号添加为第一个值,然后我将这个单词添加到usedWords并检查该单词在words. 我唯一坚持的是如何将它添加为节点并尝试对其进行排序,并将之前出现的较大节点作为它的父节点。

4

0 回答 0