我创建了自己的LinkedList,其中包含一个Song对象(标题,艺术家等等)。我试图添加一个功能,用户输入索引位置,并在该特定索引显示有关歌曲的信息。我无法获取索引的位置。目前每次我运行它都无法在索引中找到信息。我不确定是否需要实现搜索功能,或者我是否只是错误地搜索它。
我目前如何尝试按索引搜索
System.out.print("Enter song index location: ");
int searchIndex = input.nextInt();
for (int i = 0; i < list.size(); i++){
if ( list.get(i).getValue().equals(searchIndex) ){
System.out.println(list.get(i).getValue());
found = true;
}
}
if ( found != true ){
System.out.println("Song does not exist.");
}
这是我的LinkedList类
public class LinkedList {
private Node first;
private Node last;
public LinkedList(){
first = null;
last = null;
}
public boolean isEmpty(){
return first == null;
}
public int size(){
int count = 0;
Node p = first;
while( p != null ){
count++;
p = p.getNext();
}
return count;
}
public Node get( int i ){
Node prev = first;
for(int j=1; j<=i; j++){
prev = prev.getNext();
}
return prev;
}
public String toString(){
String str = "";
Node n = first;
while( n != null ){
str = str + n.getValue() + " ";
n = n.getNext();
}
return str;
}
public void add( Song c ){
if( isEmpty() ) {
first = new Node(c);
last = first;
}else{
Node n = new Node(c);
last.setNext(n);
last = n;
}
}
节点类
public class Node {
private Song song;
private Node next;
public Node( Song s ){
song = s;
next = null;
}
public Node( Song s, Node n ){
song = s;
next = n;
}
public Node getNext(){
return next;
}
public void setNext(Node n){
next = n;
}
public Song getValue(){
return song;
}
public void setValue( Song s ){
song = s;
}
答案 0 :(得分:1)
考虑到LinkedList
中的功能,您可能需要这样做:
System.out.print("Enter song index location: ");
int searchIndex = input.nextInt();
if (searchIndex >= 0 && searchIndex < list.size(){
System.out.println(list.get(searchIndex).getValue());
}
else{
System.out.println("Song does not exist.");
}
答案 1 :(得分:0)
看起来更像是Song的线性搜索。您正在检查输入的值(int,searchIndex)是否与Nody.getValue()匹配,后者返回一首歌曲。
如果您试图通过索引获取,似乎您只需调用LinkedList.get(searchIndex)?
此外:
没有理由存储最后一个节点,因为您没有双向链接列表(可以从任一端导航)。您只需要第一个节点,然后使用Node.next()进行导航。
通过在调用add()时递增它来维持计数,并在调用remove()时递减它,这可能更有效。
您应该对get()方法进行边界检查:
public Node get(int i) {
if (i >= size()) {
throw new IndexOutOfRangeException();
}
Node n = first;
int j = 0;
while (i != j) {
n = n.getNext();
}
return n;
}
建立编码风格并坚持下去!你有时会在参数周围有空格,有时你却没有。有时在开口支撑之前的空间,有时你没有。以上是我的工作。
答案 2 :(得分:0)
在链表中,您必须遍历整个列表(迭代curr节点)才能找到对象。
您的搜索应该类似于:
if (list.isEmpty()){
System.out.println("Song does not exist.");
}
boolean found = false;
int searchIndex = input.nextInt();
Node current = list;
while(current != null){
if(current.equals(searchIndex)){
found = true; //found song
break;
}
current = current.next;
}
return current;
}