我正在尝试返回与给定String输入匹配的所有节点内容。我试图做的基本上是一个非常简单的搜索引擎,用户可以在其中键入字符串,程序返回它在链表中可以找到的所有特征相似的内容。链表本身是从一个文件构建的,格式化为
<lt;游戏名称0>gt;\t<lt;游戏控制台0>gt;\n
<lt;游戏名称1>gt;\t<lt;游戏控制台1>gt;\n
其中线条用\n分隔,游戏及其相应的控制台用\t分隔。
我目前的方法是使用while循环搜索链表,为头分配一个临时值,并在它在列表中向下移动时将其重新分配给它的链接。一旦循环在节点内找到与当前输入匹配的内容,它就会停止循环并返回在节点中找到的数据。我还没有尝试是否可以用for循环来完成这项工作,因为while循环很可能在找到匹配项后不知道何时继续。我也不确定while循环参数是否是最有效的参数,因为我对它的理解非常少。我相信!temp.equals(查询)正在声明";temp不等于查询;但我有一种感觉,这可以用一种更有效的方式来完成。
这就是我到目前为止所拥有的,为了上下文起见,我将提供整个Generic链表类,但我所质疑的方法是最后一种方法,位于第126行。
我明确提出的问题是,如何搜索链接列表的内容并通过控制台返回这些内容。
import java.io.FileNotFoundException;
import java.util.Scanner;
public class GenLL<T>
{
private class ListNode
{
T data;
ListNode link;
public ListNode(T aData, ListNode aLink)
{
data = aData;
link = aLink;
}
}
private ListNode head;
private ListNode current;
private ListNode previous;
private int size;
public GenLL()
{
head = current = previous = null;
this.size = 0;
}
public void add(T aData)
{
ListNode newNode = new ListNode(aData, null);
if (head == null)
{
head = current = newNode;
this.size = 1;
return;
}
ListNode temp = head;
while (temp.link != null)
{
temp = temp.link;
}
temp.link = newNode;
this.size++;
}
public void print()
{
ListNode temp = head;
while (temp != null)
{
System.out.println(temp.data);
temp = temp.link;
}
}
public void addAfterCurrent(T aData)
{
if (current == null)
return;
ListNode newNode = new ListNode(aData, current.link);
current.link = newNode;
this.size++;
}
public T getCurrent()
{
if(current == null)
return null;
return current.data;
}
public void setCurrent(T aData)
{
if(aData == null || current == null)
return;
current.data = aData;
}
public void gotoNext()
{
if(current == null)
return;
previous = current;
current = current.link;
}
public void reset()
{
current = head;
previous = null;
}
public boolean hasMore()
{
return current != null;
}
public void removeCurrent()
{
if (current == head)
{
head = head.link;
current = head;
}
else
{
previous.link = current.link;
current = current.link;
}
if (this.size > 0)
size--;
}
public int getSize()
{
return this.size;
}
public T getAt(int index)
{
if(index < 0 || index >= size)
return null;
ListNode temp = head;
for(int i=0;i<index;i++)
temp = temp.link;
return temp.data;
}
public void setAt(int index, T aData)
{
if(index < 0 || index >= size || aData == null)
return;
ListNode temp = head;
for (int i = 0; i < index; i++)
temp = temp.link;
temp.data = aData;
}
public T search() throws FileNotFoundException {
Scanner keyboard = new Scanner(System.in);
System.out.println("Search: ");
String query = keyboard.nextLine();
ListNode temp = head;
while(!temp.equals(query))
temp = temp.link;
return temp.data;
//plus some sort of print function to display the result in the console
}
}
您可以将regex
应用于每个节点的内容,如果数据类型为string
,则将其应用于其他数据类型,如果可能,将其转换为string
,否则会引发一些异常。