2016-11-05 5 views
-2

私はHashMapに保存される新しい人物を作成できるプログラムを作成しようとしています。さらに、あなたが保管したいと思うこれらの人々の向こう側にDVDを貸すこともできます。この問題は、プログラムが新しい名前をHashMapに格納することを単に拒否したときに、NyPersonメソッドを使用しようとしているときに発生します。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

必ずしも拒否する必要はありませんが、特定の文字列をHashMap navnelisteの値として追加することはありません。 –

+0

新しいメニューオプションを選択するたびに、新しい 'DVDAdministrasjon'を作成します。新しい人物は 'HashMap'に追加されます。毎回地図全体を投げ捨てるだけです。おそらく、あなたはメニューループの外側に*移動したいかもしれません? – Andreas

答えて

0

私の知る限り理解し、新しい人を追加する1でアプリケーションと種類を起動します。もう一度やり直すと、その人物は地図に見つかりません。問題は、ループの実行ごとに新しいDVDAdministrasjonをインスタンス化するため、オブジェクトまたは新しい名前が追加されるたびに、オブジェクト全体と一緒にマップdvdadminが上書きされることです。

これを修正するには、dvdadminインスタンスをループ外に作成するだけです。さらなる注意として、あなたのケースでは、リソースリークを避けるために常にI/Oリソースを閉じてください。Scanner

+0

'System.in'上の' Scanner'は閉じられる必要があります。 – Andreas

+0

@アンドレアスなぜあなたはそれを閉じてはいけないのか説明できますか? – thatguy

+1

一般に、リソースをオープン/作成するコードはリソースをクローズする責任があります。あなたは 'System.in'リソースをオープンしておらず、' Scanner'でそれをラッピングしているだけなので、あなたはそのリソースを担当していないので、それを閉じてはいけません。言い換えれば、 'System.in'をラップせずに直接使用した場合、プログラムを終了する前に' System.in.close() 'を呼び出すでしょうか?同様に、誰も 'System.out'を閉じません。あなたはそうではありません。それらは両方ともJVMによって「所有」されています。 – Andreas

関連する問題