嗨,我收到错误消息"无法对非静态字段进行静态引用">
在下一个代码的粗体行中,我不知道如何修复它,并且我的实现对于链表是否正确,知道我希望它是一个双向链表
import java.util.Scanner;
import java.util.LinkedList;
import java.lang.Number;
public class chainLadder {
static Scanner s = new Scanner (System.in);
public LinkedList<Object> readData() {
LinkedList<Object> listData = new LinkedList();
Integer cost=0;
System.out.println("how many years are you calculating");
int numY=s.nextInt();
while(numY!=0) {
int i =1;
System.out.println("please Enter the year"+i+" to calculate from ");
String year = s.next();
listData.add(year);
listData.add(">"); // what comes after is the cost and before is the year
System.out.println("enter the costs of year"+year+"/n enter ( -1 ) when done ");
while(cost != -1) {
cost = s.nextInt();
if(cost == -1)
break;
listData.add(cost);
System.out.println("next");
}
listData.add("<"); // what comes before is the cost and after is the year
numY--;// going down till we finish all the years
i++;
}//end of while
return listData;
}//end method readData
}//end class
通常,当您收到错误时,您应该包括编译器标记为包含错误:)的行 - 只是一个提示。
你的问题是"静态"是一个有点奇特的概念,至少相对于学习Java的最初几周而言。我建议你避免它。为此,请将其用作骨架:
class MyApp {
public static void main(String[] args) throws Exception {
new MyApp().go();
}
void go() throws Exception {
// your code goes here
}
}
如果需要命令行参数,请为go
方法指定String[] args
参数。然后,不要做任何静态的东西,除了main
必须的
。静态当然是有用的,但也许不是一个特别值得开始Java学习的概念,如果你不理解它,它只会引起无休止的混乱。
如果你坚持不做这个改变,你必须在chainLadder
的 ist 上调用readData
方法,所以:new chainLadder().readData();
,而不是chainLadder.readData();
。
拥有一个"异构"列表(一个包含不同概念的列表;你的列表包含年份值和成本作为单独的对象(是非常不像Java的。
你应该创建一个表示年份/成本对的类,并将其设为List<YearInfo>
或其他什么,或者更有可能你想要一个将年份映射到成本的地图,所以,一个Map<Integer, Integer>
。
您使用的是现有的链表,而不是编写自己的链表。如果你需要一个双向链表,因为家庭作业需要它,那么重点是你自己编写整个实现,而不是使用java.util.LinkedList
,以便你了解链表是如何工作的。没有现实生活中的要求去'它..必须。。成为双链表!鉴于只有几千年与人类相关,您的列表永远不会包含足够的项目。因此,ArrayList
是正确的答案,即使它在算法上看起来不合理。也就是说,如果你想要一个列表 - 如果这不是家庭作业练习,很可能Map
就是你要找的。