2016-11-05 84 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

相關問題