我正在创建一个程序,它将读取文件,按字典顺序组织所有单词,并输出单词,文档中出现的次数以及它出现的行。我已经在四个不同的类文件中实现了这个代码。但是,我无法将单词链接到链接列表,链接列表将显示链接列表到达的行号。我应该使用前后节点遍历列表,我不确定如何进行迭代这个列表并打印出每个单词。
这里是获取字符串并创建链表的类的代码:
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;
}
最大的问题是第二类中的插入函数。我不能理解如何链接前后,并且每次以稍后调用的方式调用函数时始终添加新节点
答案 0 :(得分:0)
如果您的第一个问题是如何为insert
编写IntQueue
方法,那么这里有一些建议。我假设您不希望编写代码,因为这看起来很可能是一项任务。
构建列表时,您正在创建一个新节点front
。这可能是个错误。该列表最初为空,通常表示为front
,rear
为null
。
在insert
中要做的第一件事是检查front
是否为空。如果是,您只需将front
和rear
设置为新节点。
之后您知道rear
将指向最近插入的节点,因此您只需要检查要插入rear.lineNumber
的新int。
假设您需要一个新节点,创建它,让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,如果是,则递增计数。