11 svar
389 visningar
Tjonken är nöjd med hjälpen
Tjonken 7 – Fd. Medlem
Postad: 5 maj 2018 05:10

ArrayList i objekt i ArrayList. Koppla samman och få ut.

Hej. Har suttit tre dagar nu och mina rumskamrater tycker jag börjar bli galen så inser att jag behöver hjälp.

Är ny på java och tycker det är förbannat svårt emellanåt. 

Det hela handlar om en bank som ska kunna ha kunder. Varje kund ska kunna ha flertalet bankkonton med unika kontoNr.  Klasser som måste användas: Bank (controller), Kund, Konto och Banksystem (view/main).

Jag vill använda en metoden för att få ut en kunds info samt dess tillhörande bankkonto.

I klassen Bank har jag skapat denna metod som inte verkar funka för att hämta ut kunden som finns i ett särskilt index i Bankens arraylist över kunder (identifieras genom personnummer).

public void showClient(){
String PNr;
int idx;
Kund k = new Kund();
System.out.println("Skriv in Kunds personNr");
PNr = input.next();
idx = kundlista.indexOf(PNr);

k = kundlista.get(idx);
k.showKontolista();
}

 

I Klassen Kund är det denna metod som kallas i koden ovan. 

public void showKontolista(){
System.out.println("kontonr : saldo");
for(Konto k : kontolista){
System.out.println(k.getKontoNr() + " : " + k.getSaldo());
}
}

 

I min testklass för att se om koden fungerar eller ej har jag skrivit in följande:
public class BankTest {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
Konto konto = new Konto();
Kund kund = new Kund();
Bank bank = new Bank();

String KNr = "9201071199001";
String PNR = "9201071199";

konto.setKontoNr(KNr);
konto.inbetalning(500);

//lägga till kontobjektet i Arraylist i Kund  genom denna metod (konfirmerat funkar)
kund.addKonto(konto);

//Lägger till Personnummer i kund och lägger sedan in den genom en metod i bankens ArrayList över kunder. 
kund.setPersonNr(PNR);
bank.addClient(kund);

//Kallar på metod som borde skriva ut kunds kontolista
bank.showClient();

 

 

 

Jag har försökt på många andra sätt mer. Har suttit i flera dagar som sagt. Fattar ej varför det inte funkar. Extremt tacksam för hjälp.

 

MVH
TJonken

AlvinB 4014
Postad: 5 maj 2018 10:18

Kan du ge oss outputen som skrivs ut när du kör programmet?

Lindehaven 820 – Lärare
Postad: 5 maj 2018 10:37 Redigerad: 5 maj 2018 10:37

Vilka värden har du på kundlista och PNr?

idx = kundlista.indexOf(PNr);

k = kundlista.get(idx);

Vilka värden får du då på idx och k?

Om du vill slippa ödsla onödigt mycket tid på felsökning så bör du skapa bra tester, exvis i JUnit.

Lindehaven 820 – Lärare
Postad: 7 maj 2018 10:53

Fick du ut någonting vid programkörning? Fick du fram värdena på kundlista, PNr, idx och k vid programkörning? Om du vill och kan publicera all din källkod för detta någonstans så kan jag titta närmare på den.

Tjonken 7 – Fd. Medlem
Postad: 8 maj 2018 19:16
AlvinB skrev:

Kan du ge oss outputen som skrivs ut när du kör programmet?

 Hej. Får ut detta: 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:422)
at java.util.ArrayList.get(ArrayList.java:435)
at Ex3D0019N.Bank.showClient(Bank.java:116)
at Ex3D0019N.BankTest.main(BankTest.java:41)
C:\Users\olsso\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 3 seconds)

Tjonken 7 – Fd. Medlem
Postad: 8 maj 2018 19:23 Redigerad: 9 maj 2018 10:08
Lindehaven skrev:

Vilka värden har du på kundlista och PNr?

idx = kundlista.indexOf(PNr);

k = kundlista.get(idx);

Vilka värden får du då på idx och k?

Om du vill slippa ödsla onödigt mycket tid på felsökning så bör du skapa bra tester, exvis i JUnit.

Får ut detta:

idx: -1
ku: Ex3D0019N.Kund@1b6d3586
Kundlista: [Ex3D0019N.Kund@4554617c]
PNR: = det jag matar in som PNR (funkar).

Så jag inser att felet ligger här.. Tappar nätan bort mig själv i all kod jag gjort eftersom jag ändrat fram och tillbaka så mycket i sökandet efter att få till det.   Vad brukar grundläggande felet vara när man får denna typ av felmeddelanden? 

Lindehaven 820 – Lärare
Postad: 8 maj 2018 20:01

idx = kundlista.indexOf(PNr);

Här blir det fel eftersom PNr inte hittas i kundlista. PNr är en sträng så jag tror inte att det är indexOf du vill använda.

k = kundlista.get(idx);

"ArrayIndexOutOfBoundsException: -1" blir det eftersom kundlistan inte kan indexeras med negativa värden.

Lindehaven 820 – Lärare
Postad: 9 maj 2018 09:02 Redigerad: 9 maj 2018 09:08
Lindehaven skrev:

idx = kundlista.indexOf(PNr);

Här blir det fel eftersom PNr inte hittas i kundlista. PNr är en sträng så jag tror inte att det är indexOf du vill använda.

Om du vill använda indexOf() så prova på objektets String istället för själva objektet i din ArrayList. Annars finns t ex metoden equalsString-objekt. Kan inte sjäv prova om det funkar just nu men det är ett par idéer. 

idx = kundlista.personnummer.indexOf(PNr);

Jag tror att ett av syftena med uppgiften är att skriva koden som en Model-View-Controller (MVC), eller hur? I så fall bör du strukturera om koden:

  • Model-klasserna (Kund och Konto?) ska endast innehålla modellen av systemet med metoder för att ändra och hämta data - inte någon manuell inmatning och inga utskrifter
  • View-klassen (Banksystem?) ska endast hämta data från Model-objekt och göra utskrifter - inte någon manuell inmatning
  • Controller-klassen (Bank?) ska ta manuell inmatning och göra eventuella ändringar av data i Model-objekt - inte några direkta utskrifter

Om du gör den omstruktureringen och skriver korta och enkla metoder så kan du testa varje klass på ett enklare sätt. Det sparar tid och frustration. Tro mig.

Tjonken 7 – Fd. Medlem
Postad: 9 maj 2018 16:33
Lindehaven skrev:
Lindehaven skrev:

idx = kundlista.indexOf(PNr);

Här blir det fel eftersom PNr inte hittas i kundlista. PNr är en sträng så jag tror inte att det är indexOf du vill använda.

Om du vill använda indexOf() så prova på objektets String istället för själva objektet i din ArrayList. Annars finns t ex metoden equalsString-objekt. Kan inte sjäv prova om det funkar just nu men det är ett par idéer. 

idx = kundlista.personnummer.indexOf(PNr);

Jag tror att ett av syftena med uppgiften är att skriva koden som en Model-View-Controller (MVC), eller hur? I så fall bör du strukturera om koden:

  • Model-klasserna (Kund och Konto?) ska endast innehålla modellen av systemet med metoder för att ändra och hämta data - inte någon manuell inmatning och inga utskrifter
  • View-klassen (Banksystem?) ska endast hämta data från Model-objekt och göra utskrifter - inte någon manuell inmatning
  • Controller-klassen (Bank?) ska ta manuell inmatning och göra eventuella ändringar av data i Model-objekt - inte några direkta utskrifter

Om du gör den omstruktureringen och skriver korta och enkla metoder så kan du testa varje klass på ett enklare sätt. Det sparar tid och frustration. Tro mig.

 Tackar för all hjälp, verkligen uppskattat. Försöker tillämpa det du säger.

Du har helt rätt i att koden ska vara enligt MVC.  Ska försöka ändra så att det blir som du säger. Jag blir lite förvirrad eftersom genom att använda MVC-tänk tycker jag man driftar iväg från att tänka enligt klasser. Alltså istället för att tänka t ex vad har klassen Bank för egenskaper och beteenden så blir det som att man frånser från detta till förmån för MVC-tänk där Bank egentligen inte bör heta Bank utan enbart Controller (en klass vid namn controller)..



Lindehaven 820 – Lärare
Postad: 9 maj 2018 17:16

Jag tycker att du tänker rätt med exvis klassen Bank med dess egenskaper och beteenden. Samma gäller klasserna Kund och Konto. Dessa tre klasser är tydligt delar av Model. Därför satte jag frågetecken efter Bank som Controller-klass och tycker som du att Controller och Viewer kan ligga i egna klasser.

Jag provade att implementera uppgiften och valde då att lägga Model i klasserna Bank, Kund och Konto med enbart constructor, setters och getters. Lade Controller och Viewer tillsammans i klassen BankSystem med metoder för inmatning och utskrift. Eftersom systemet är så litet så blir klassen BankSystem (innehållande main()) hanterbart liten.

Skapade också testklasser för Model. Använder BlueJ för såna här små Java-hack och där ser det ut så här:

Tjonken 7 – Fd. Medlem
Postad: 9 maj 2018 19:24

Stort tack för hjälpen. Har kommit ett steg vidare (lyckats med det jag frågade om här). Komplicerade till det för mycket innan med andra metoder än set och get i Models. 

Lindehaven 820 – Lärare
Postad: 9 maj 2018 22:05

Bra jobbat, du verkar vara på rätt väg. Du fixar det.

Svara Avbryt
Close