当我尝试从hashmap获取对象以便我可以使用它时,我收到错误。当我用这句话时:
Linje 1=linjerMap.get(linjeList[i]);
其中Linje是Object,1是想要的对象变量,linjerMap是hashmap,linjeList是存储对象的键名称的地方。
其余代码:
import java.util.*;
import java.io.*;
class Oblig5{
public static void main(String[] args){
Planlegger starten=new Planlegger();
starten.lesFil();
}
}
class Planlegger{
Scanner input=new Scanner(System.in);
HashMap<String, Linje> linjerMap=new HashMap<String, Linje>();
HashMap<String, Stasjon> stasjonerMap=new HashMap<String, Stasjon>();
void lesFil(){
Linje linjer;
Stasjon stasjoner;
String linjeLest="";
String aktuellLinje="";
String linjeNummer="";
char[] linjeNummerA;
int linjeNummerInt=0;
try{
Scanner innFil=new Scanner(new File("Rutetabell.txt"));
while(innFil.hasNextLine()){
linjeLest=innFil.nextLine().toLowerCase();
if(linjeLest.contains("linje")){
System.out.println("TESTILINJE");
//Bruker en string for linjenummeret her for å lette bruken av nummeret som key i HashMapen.
linjeNummerInt=Integer.parseInt(linjeLest.replaceAll("[\\D]", ""));
// linjeNummerA[0]=linjeLest.split("*linje* ").charAt(0);
// linjeNummer=linjeNummer[0];
linjer=new Linje(linjeNummer);
aktuellLinje=linjeNummer;
linjerMap.put(linjeNummer, linjer);
}else{
System.out.println("TESTISTASJON");
//Dersom ikke objektet finnes i hashmapen for stasjoner allerede, så lages objektet og lagres i HashMapen.
if(!stasjonerMap.containsKey(linjeLest)){
stasjonerMap.put(linjeLest, new Stasjon(linjeLest));
}
//Her henter jeg ut objektet vi lager over, og om det ikke lages fordi det allerede eksisterer så hentes det ut uansett.
stasjoner=stasjonerMap.get(linjeLest);
//Her brukes objektinformasjonen over til å registrere stasjonen i objektet
linjer=linjerMap.get(aktuellLinje);
linjer.registrerStasjoner(linjeLest, stasjoner);
stasjoner.registrerNyLinje(aktuellLinje, linjer);
}
}
innFil.close();
}catch(IOException e){
e.printStackTrace();
}
System.out.println("Test");
String sjekkHashmap=input.nextLine();
if(stasjonerMap.containsKey(sjekkHashmap)){
System.out.println("Det funker!");
}
}
void beregnRuter(Stasjon fraSt, Stasjon tilSt){
}
void lesFraTil(){
fraStasjon();
}
void fraStasjon(){
boolean sjekkStasjon=true;
while(sjekkStasjon){
System.out.println("Vennligst tast inn fra-stasjonen: ");
String startStasjon=input.next().toLowerCase();
if(stasjonerMap.containsKey(startStasjon)){
sjekkStasjon=false;
tilStasjon(startStasjon);
}else{
System.out.println("Stasjon ikke funnet.");
sjekkStasjon=true;
}
}
}
void tilStasjon(String startStasjon){
boolean sjekkStasjon=true;
while(sjekkStasjon){
System.out.println("Vennligst tast inn til-stasjonen: ");
String sluttStasjon=input.next().toLowerCase();
if(stasjonerMap.containsKey(sluttStasjon)){
sjekkStasjon=false;
rutePlanlegger(startStasjon, sluttStasjon);
}else{
System.out.println("Stasjon ikke funnet.");
sjekkStasjon=true;
}
}
}
void rutePlanlegger(String startStasjon, String sluttStasjon){
Stasjon til=stasjonerMap.get(startStasjon);
Stasjon fra=stasjonerMap.get(sluttStasjon);
int tilStasjonsTall, fraStasjonsTall;
int retning;
double tid= 0.0;
String endeStasjonsNavn;
tilStasjonsTall=0;
fraStasjonsTall=0;
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if(fra.linjeList[i].equals(til.linjeList[j])){
Linje 1=linjerMap.get(linjeList[i]);
retning=1.stasjonsNummer(startStasjon) - 1.stasjonsNummer(sluttStasjon);
endeStasjonsNavn=1.endestasjon(retning).stasjonsNavn;
System.out.println("Ta T-bane linje " + 1.linjeNummer + " fra " + startStasjon + " til " sluttStasjon + " i retning " + endeStasjonsNavn + ". Estimert reisetid: " + tid);
}
}
}
}
class Linje{
String linjeNummer="";
HashMap<String, Stasjon> linjeStasjoner=new HashMap<String, Stasjon>();
int antallStasjoner=0;
int type=0;
ArrayList<Stasjon> stasjonsList=new ArrayList<Stasjon>();
int antall=stasjonsList.length();
Linje(String linjeNummer){
this.linjeNummer=linjeNummer;
if (linjeNummer<10){
type=0;
}else{
type=1;
}
}
void registrerStasjoner(String linjeLest, Stasjon stasjon){
linjeStasjoner.put(linjeLest, stasjon);
stasjonsList.add(stasjon);
antallStasjoner++;
}
boolean inneholder(Stasjon stasjon){
boolean sannhetsSjekk=true;
if(stasjonsList.contains(stasjon)){
sannhetsSjekk=true;
}else{
sannhetsSjekk=false;
}
return sannhetsSjekk;
}
Stasjon endestasjon(int retning) {
if (retning > 0) {
return stasjoner[0];
}
return stasjoner[antall-1];
}
int stasjonsNummer (Stasjon s) {
for (int i = 0; i < stasjonsList.length(); ++i) {
if (stasjoner[i] == s) {
return i;
}
}
return -1;
}
}
class Stasjon{
String stasjonNavn;
Linje linje;
HashMap <String, Linje> stasjonsLinjer=new HashMap<String, Linje>();
ArrayList<Linje> linjeList=new ArrayList<Linje>();
int teller=0;
Stasjon(String linjeLest){
this.stasjonNavn=linjeLest;
}
void registrerNyLinje(String aktuellLinje, Linje linje){
stasjonsLinjer.put(aktuellLinje, linje);
linjeList.add(linje);
teller++;
}
}
class Overgang{
Linje l1, l2;
Stasjon fra,til,bytte;
Planlegger planlegger;
}
错误:
oblig5.java:129:错误:不是声明 Linje 1 = linjerMap.get(linjeList [i]); ^
答案 0 :(得分:1)
您不能将变量命名为数字文字(或以任何数字开头)。尝试
Linje one = linjerMap.get(linjeList[i]);
Section 3.8 of the JLS涵盖了可以作为法律标识符的内容(强调我的):
标识符是Java字母和Java数字的无限长度序列,第一个必须是Java字母。
标识符
IdentifierChars但不是Keyword或BooleanLiteral或NullLiteral
IdentifierChars:
JavaLetter IdentifierChars JavaLetterOrDigit
JavaLetter:
任何Java字母的Unicode字符(见下文)
JavaLetterOrDigit:
任何Java字母或数字的Unicode字符(见下文)
A&#34; Java letter&#34;是Character.isJavaIdentifierStart(int)方法返回true的字符。
A&#34; Java字母或数字&#34;是Character.isJavaIdentifierPart(int)方法返回true的字符。
&#34; Java字母&#34;包括大写和小写ASCII拉丁字母AZ(\ u0041- \ u005a)和az(\ u0061- \ u007a),以及由于历史原因,ASCII下划线(_,或\ u005f)和美元符号($,或\ u0024)。 $字符只能用于机械生成的源代码,或者很少用于访问旧系统上预先存在的名称。
&#34; Java数字&#34;包括ASCII数字0-9(\ u0030- \ u0039)。
答案 1 :(得分:0)
变量名称不能以数字开头。所以,'1'是错误的变量名。而不是
Linje 1=linjerMap.get(linjeList[i]);
你应该有这样的东西:
Linje x1=linjerMap.get(linjeList[i]);
答案 2 :(得分:0)
来自here
变量名称区分大小写。变量的名称可以是任何合法的 identifier - 无限长度的Unicode字母和序列 数字,以字母开头,美元符号“$”或者 下划线字符“”。然而,该公约始终是开始的 您的变量名称带有字母,而不是“$”或“”。另外, 按照惯例,美元符号字符从未使用过。你可以 找到一些自动生成的名称将包含的情况 美元符号,但您的变量名应始终避免使用它。一个 对于下划线字符存在类似的约定;虽然它是 在技术上合法,用“_”开始变量的名称,这个 不鼓励练习。不允许有空白区域。随后 字符可以是字母,数字,美元符号或下划线 字符。约定(和常识)也适用于此规则。 为变量选择名称时,请使用完整的单词而不是 神秘的缩写。这样做可以使您的代码更易于阅读和 了解。在许多情况下,它也会生成您的代码 自记录文件;例如,名为cadence,speed和gear的字段 比缩写版本更直观,例如s,c和 G。另请注意,您选择的名称不得是关键字或 保留字。如果您选择的名称只包含一个单词拼写 所有小写字母的单词。如果它由多个组成 单词,大写每个后续单词的第一个字母。名字 gearRatio和currentGear是这个惯例的主要例子。如果 您的变量存储一个常量值,例如static final int NUM_GEARS = 6,约定略有变化,每个都大写 用下划线字母分隔后续单词。 按照惯例,下划线字符从未在别处使用过。
答案 3 :(得分:0)
您正在将映射中的对象分配给名称为1的变量,而Java中是不允许的。相反,你需要
Linje linje1 = linjerMap.get(linjeList[i]);
有关详细信息,请参阅此处:http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367