在尝试从hashmap获取对象时获取“不是语句

时间:2013-11-18 19:49:36

标签: java object hashmap

当我尝试从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]);                                           ^

4 个答案:

答案 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