2016-11-05 80 views
-2

我试图创建一个程序,用户可以在其中创建一个将存储在HashMap中的新人。此外,您还可以从我希望存储的这些人的对面借出DVD。当我尝试使用方法NyPerson时,问题就到了,当程序拒绝将新名称存储在HashMap中时。尝试在HashMap中存储值时遇到一些问题

这里是我的代码(代码地块的这么多多包涵):

类与nyPerson方法:

import java.util.*; 
class DVDAdministrasjon { 

private HashMap<String, Person> navneliste = new HashMap<String, Person>(); 

public void nyPerson(String navnPerson) { 
    if(navneliste.containsKey(navnPerson)) { 
     System.out.println(navnPerson + " er allerde i listen"); 
    } else { 
     Person nyPerson = new Person(navnPerson); 
     navneliste.put(navnPerson, nyPerson); 

    } 
} 

public void kjop(String navnPerson, String navnDVD) { 
    if (navneliste.containsKey(navnPerson)) { 
     navneliste.get(navnPerson).kjop(navnDVD); 
    } else { 
     System.out.println("Det er ingen personer som heter " + navnPerson); 
    } 
} 

public void laan (String navnLaaner, String navnUtlaaner, String navnDVD) { 
    if (navnLaaner.equals(navnUtlaaner)) { 
     System.out.println("Du kan ikke laane en DVD fra deg selv"); 
    } else if (navneliste.containsKey(navnLaaner) &&    

    navneliste.containsKey(navnUtlaaner)) { 
     Person utlaaner = navneliste.get(navnUtlaaner); 
     Person laaner = navneliste.get(navnLaaner); 

     if (utlaaner.ledig(navnDVD)) { 
      laaner.laan(navnDVD, utlaaner); 
     } else { 
      System.out.println("Den DVD-en er utlaant eller eies ikke av   denne personen"); 
     } 

    } else { 
     System.out.println("Sjekk at laaner og utlaaner eksisterer"); 
    } 
} 

public void retur (String navnPerson, String navnDVD) { 
    if (navneliste.containsKey(navnPerson)) { 
     navneliste.get(navnPerson).retur(navnDVD); 
    } else { 
     System.out.println("Det er ingen personer som heter " + navnPerson); 
    } 
} 

public void visPerson(String navnPerson) { 
    if (navnPerson.equals("*")) { 
     for (Person person : navneliste.values()) { 
      person.printDVDer(); 
     } 

    } else if (navneliste.containsKey(navnPerson)){ 
     navneliste.get(navnPerson).printDVDer(); 
    } else { 
     System.out.println("Det er ingen personer som heter " + navnPerson); 
    } 
    } 

    public void visOversikt() { 
    for (Person person : navneliste.values()) { 
     person.oversikt(); 
    } 
    } 

    public void printPersoner(){ 
    for(Person person : navneliste.values()) 
    System.out.println(person); 
} 

public void printArkiv(String navnPerson) { 
    navneliste.get(navnPerson).printArkiv(); 
} 

public void avslutt(){ 
    System.out.println("Goodbye"); 
    System.exit(0); 
} 
} 

我Person类:

import java.util.*; 

class Person { 

private String navn; 
private HashMap<String, DVD> arkiv = new HashMap<String, DVD>(); 
private HashMap<String, DVD> laante = new HashMap<String, DVD>(); 
private HashMap<String, DVD> utlaante = new HashMap<String, DVD>(); 

public Person(String navn) { 
    this.navn = navn; 
} 

public void kjop(String navn) { 
    if (arkiv.containsKey(navn)) { 
     System.out.println("Du eier allerede denne dvd'en"); 
    } else { 
     DVD nyDVD = new DVD(navn, this); 
     arkiv.put(navn, nyDVD); 
    } 
} 

public void laan(String navnDVD, Person utlaaner) { 
    laante.put(navnDVD, utlaaner.utlaan(navnDVD)); 
} 

public DVD utlaan(String navnDVD) { 
    DVD utlaanDVD = arkiv.get(navnDVD); 
    utlaante.put(navnDVD, utlaanDVD); 
    return utlaanDVD; 
} 

public void retur(String navnDVD) { 
    if (laante.containsKey(navnDVD)) { 
     laante.remove(navnDVD).retur(); 
    } else { 
     System.out.println(navn + " laaner ikke denne dvd-en"); 
    } 
} 

public void faaTilbake(String tilbake) { 
    utlaante.remove(tilbake); 
} 

public boolean ledig(String navnDVD) { 
    return (arkiv.containsKey(navnDVD) && !utlaante.containsKey(navnDVD)); 
} 

public void printArkiv() { 
    for (DVD dvd : arkiv.values()) { 
     System.out.println(dvd); 
    } 
} 

public void printDVDer() { 
    System.out.println("\n" + navn + ":"); 
    System.out.println("Eier:"); 
    for (String key : arkiv.keySet()) { 
     System.out.println("+ " + key); 
    } 
    System.out.println("Laaner:"); 
    for (String key : laante.keySet()) { 
     System.out.println("- " + key); 
    } 
} 

public void oversikt() { 
    System.out.println("\n" + navn + ":"); 
    System.out.println("Eier: " + arkiv.size()); 
    System.out.println("Laant: " + laante.size()); 
    System.out.println("Utlaant: " + utlaante.size()); 
} 

public String toString() { 
    return this.navn; 
} 

} 

DVD类:

import java.util.*; 
class DVD { 

private Person eier; 
private Person laaner; 
private String navn; 

public DVD(String navn, Person eier) { 
    this.navn = navn; 
    this.eier = eier; 
    this.laaner = null; 
} 

public Person getEier() { 
    return this.eier; 
} 

public String toString() { 
    return this.navn; 
} 

public void retur() { 
    eier.faaTilbake(navn); 
} 

} 

而他再是我的主(到目前为止):

import java.util.*; 

public class DVDMain{ 
public static void main(String [] args){ 

Scanner tastatur = new Scanner(System.in); 
String alternativ = ""; 


while(!alternativ.equals("7")){ 
System.out.println("MENY FOR DVD-ADMINISTRASJON"); 
System.out.println("1. Ny person"); 
System.out.println("2. Kjop"); 
System.out.println("3. Laan"); 
System.out.println("4. Vis"); 
System.out.println("5. Oversikt"); 
System.out.println("6. Retur"); 
System.out.println("7. Avslutt"); 
alternativ = tastatur.nextLine(); 



DVDAdministrasjon dvdadmin = new DVDAdministrasjon(); 
if (alternativ.equals("1")){ 
    System.out.println("Hva heter den nye personen?"); 
    String nyperson = tastatur.nextLine(); 
    dvdadmin.nyPerson(nyperson); 
    System.out.println(nyperson + " er registrert!"); 
} 

else if (alternativ.equals("2")){ 
    System.out.println("Hvem har kjopt DVD-en?"); 
    String navnPerson = tastatur.nextLine(); 
    System.out.println("Hva er tittelen paa DVD-en?"); 
    String navnDVD = tastatur.nextLine(); 
    dvdadmin.kjop(navnPerson, navnDVD); 
} 
else if(alternativ.equals("3")){ 
    System.out.println("Hvem vil laane DVD-en?"); 
    String navnLaaner = tastatur.nextLine(); 
    System.out.println("Hvem skal DVD-en laanes fra?"); 
    String navnUtlaaner = tastatur.nextLine(); 
    System.out.println("Hva er tittelen paa DVD-en?"); 
    String navnDVD = tastatur.nextLine(); 
    dvdadmin.laan(navnLaaner, navnUtlaaner, navnDVD); 
} 
} 
} 
} 
+1

“程序只是拒绝”是什么意思? – Andreas

+0

不一定拒绝,但不会将特定的String添加为HashMap navneliste中的值。 –

+0

每次您选择新的菜单选项时,您都会创建一个新的“DVDAdministrasjon”。新的人*被添加到'HashMap'中,每次只需将整个地图扔掉。也许你可能想在菜单循环之外移动它* – Andreas

回答

0

据我了解,你启动应用程序,并输入1添加一个新的人。如果您再次执行该操作,则该地图中找不到该人员。问题在于,您在循环的每次运行中实例化一个新的DVDAdministrasjon,因此每次添加人员或新名称时,都会覆盖地图以及整个对象dvdadmin

要解决这个问题,只需在循环外部创建dvdadmin实例即可。作为进一步说明,请始终关闭I/O资源以避免资源泄漏,您的情况为Scanner

+0

'System.in'上的'Scanner'应该/不需要关闭。 – Andreas

+0

@Andreas你能解释为什么不应该关闭它吗? – thatguy

+1

通常,打开/创建资源的代码负责关闭它。你不打开'System.in'资源,只是用'Scanner'封装它,所以你不是资源的负责人,因此你不应该关闭它。换一种说法,如果你没有包装'System.in',而只是直接使用它,你会在退出程序之前调用'System.in.close()'吗?不会。同样,没有人关闭'System.out'。你不应该这样做。它们都由JVM“拥有”。 – Andreas

相关问题