我正在创建一个程序,该程序将读取文件,按字典顺序组织所有单词,并输出单词,它在文档中出现的次数以及它出现的行。我已经在四个不同的类文件中实现了此代码。但是,我在将单词链接到链表时遇到问题,该链表将显示链表到达的行号。我应该使用前后节点来遍历列表,并且不确定如何遍历此列表并打印出每个单词。
以下是类的代码,该类采用字符串并创建链表:
private class Node
implements Entry<String, IntQueue> {
String key;
IntQueue queue = new IntQueue();
Node link;
Node(String keyword, Node newlink) {
key = keyword;
link = newlink;
}
public String getKey() {
return key;
}
public IntQueue getValue() {
return queue;
}
public IntQueue setValue(IntQueue queue) {
throw new UnsupportedOperationException();
}
}
private Node head = new Node("", null);
public ListMap() {
// Not needed, since head defaults to null anyway.
}
public void insert(String key, int linenr) {
misc.trace("insert", key, linenr);
Node prevcursor = head;
Node cursor = head.link;
boolean write = false;
while (cursor != null) {
if (key.compareTo(cursor.getKey()) < 0) {
prevcursor.link = new Node(key, prevcursor.link);
prevcursor.link.getValue().insert(linenr);
write = true;
break;
}
if (key.compareTo(cursor.getKey()) == 0) {
cursor.queue.insert(linenr);
write = true;
break;
}
prevcursor = prevcursor.link;
cursor = cursor.link;
}
if (!write) {
prevcursor.link = new Node(key, prevcursor.link);
prevcursor.link.getValue().insert(linenr);
}
}
这是精确地制作 int 链表的代码:
class IntQueue
implements Iterable<Integer> {
private class node {
int linenr;
node link;
node(int number, node newlink) {
linenr = number;
link = newlink;
}
}
private int count = 0;
private node rear = null;
private node front = new node(0, null);
private int linenumb = 0;
private int count = 0;
private node rear = null;
private node front = null;
private int linenumb= 0;
public void insert (int number) {
++count;
misc.trace (count);
if(front=null){
node temp = new node(number,rear.link);
front = temp;
rear = temp;
}else{
if(linenumb != number ){
rear.link= new node(number,null);
}
}
linenumb = number;
rear = rear.link;
}
最大的问题是第二类中的插入功能。我不明白如何链接前后,并在每次调用函数时以以后可以调用的方式一致地添加新节点
如果您的第一个问题是如何为IntQueue
编写insert
方法,那么这里有一些建议。我假设您不希望编写代码,因为这看起来像是一个任务。
-
您正在创建一个新节点作为构造列表时的
front
。这很可能是一个错误。该列表最初为空,通常表示为front
,rear
正在null
。 -
insert
中要做的第一件事是检查front
是否为空。如果是,您只需设置front
并rear
到新节点。 -
之后,您知道
rear
将指向最近插入的节点,因此您只需检查要插入的新 intrear.lineNumber
。 -
假设您需要一个新节点,请创建它,
rear.link
指向它,然后rear
指向它。
大功告成。
由于您的赋值是一个链表,每个节点都包含一个链表,我希望您的类定义如下:
class WordList {
private class Node {
private String word;
private int count;
private LineNumberList lineNumbers;
private Node next;
}
private Node head;
private Node tail;
public addWord(String word, int lineNumber) {
...
}
}
class LineNumberList {
private class Node {
private int lineNumber;
private Node next;
}
private Node head;
private Node tail;
public addLineNumber(int lineNumber) {
...
}
}
addWord
和addLineNumber
都应该遵循与我上面的算法相同的模式。但是,addWord
需要首先查找该单词,如果不存在,则以 1 的计数插入它,如果存在,则增加计数。