Permalänk
Medlem

ArrayList java (igen)

Hejsan!

Jag får det inte att funka :,-(

Jag vill göra en ArrayLista med både stängar och integers med får mest en massa fel.
Jag vill även kunna samla flera listor i en utskrift. Dvs, printAll. Jag fick detta att funka förut, men så fort jag försökte få in Arraylistan i main så körde det ihop sig.

Om jag skriver:
ArrayList<String>hejsan = new ArrayList<String>();
hejsan.add("Tjenare");
så funkar allt utmärkt.

Men om jag har

import java.util.*; class Prison{ public static void main(String[] args) { ArrayList<Inmate>psycho = new ArrayList<Inmate>(); psycho.add("Dalton", 1234); //method add (int, Inmate) in the type ArrayList<Inmate>is not applicable for the arguments (String, int) Inmate.printallInmates(); //undefined } } //Ny class class Inmate{ private String name; private int number; public Inmate(String name, int number){ this.name = name; this.number = number; allInmates.add(this); } public void printAllInmatessInfo(){ for(int i=0; i<allInmates.size();i++){ System.out.println("\nNamn: " + allInmates.get(i).Name + "\nNummer: " + allInmates.get(i).Number); } } }

så funkar det inte.

Hjäääällp!!!!

Permalänk

Snabbt svar psycho.add("Dalton", 1234); borde funka bättre om du verkligen ger den "Inmate" objektet. Alltså psycho.add(new Inmate("Dalton",1234)); Sedan för att printa psycho.get(0).printallInmates();

Visa signatur

(Asus Z87-A && i7-4770K && ASUS Strix GTX 970 && Fractal Design Define R4 && Corsair CX500M && Samsung 840 Evo 500GB && Noctua NH-U9B SE2 && (Arch Linux 4.2.3-1 || Windows 10 Pro))

Permalänk
Medlem

Awsome!!!

Tack så otroligt. Det där hjälpte verkligen

Permalänk
Medlem

Hmmm.... jag hängde nog inte riktigt med på printdelen.....

Permalänk
Medlem

Han menar att du printar ur din arraylist index 0. Dvs där du har ditt inmateobjekt samt din int.

För att printa hela listan i din metod kan du använda dig utav en for-each.

T ex

for(Inmate print : psycho){ System.out.println(print); }

Visa signatur

"Happiness is only real when shared"

Permalänk
Medlem

Ja, det var i konstruktorn det körde ihop sig

Permalänk
Medlem

För närvarande ser det ut som detta:

import java.util.*; class Crooks{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); String name; int number; ArrayList<Bandit>list = new ArrayList<>(); System.out.println("Namn: "); name = scan.next(); System.out.println("Nummer"); number = scan.nextInt(); list.add(new Bandit(name, number)); list.add(new Bandit("Dalton", 1234)); list.add(new Bandit("Ma Baker", 6421)); for(Bandit b : list){ System.out.println(b); } } } class Bandit{ private String name; private int number; public Bandit(String name, int number){ this.name = name; this.number = number; } public String toString(){ return "Namn: " + this.name + "\nNummer: " + this.number + "\n"; } }

Jag jobbar just nu på att försöka få ihop en "räknare". Dvs som kan räkna ihop banditerna
#1
Namn: Ma Baker
Nummer: 8766

#2
Namn: Dalton
Nummer: 3456

osv

Jag är verkligen MYCKET tacksam för hjälpen

Permalänk
Medlem

Fixat

import java.util.*; class Crooks{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); String name; int number; ArrayList<Bandit>list = new ArrayList<>(); System.out.println("Namn: "); name = scan.next(); System.out.println("Nummer"); number = scan.nextInt(); list.add(new Bandit(name, number)); list.add(new Bandit("Dalton", 1234)); list.add(new Bandit("Ma Baker", 6421)); for(int i =0; i <list.size(); i++){ // System.out.println("# " + (i+1)); for(Bandit b : list){ System.out.println("#" + (i+1) + "\n" + b); }} } }

Frågan nu blir ju, är det ok att ha for-looparna i main-klassen? Eller brukar det föredras att man har det i konstruktorn?
Jag är som sagt rätt långt ifrån kursen jag går, men jag vill gärna lära mig detta och jag pluggar bara för min egen skull (inget jobb eller så). Och ja, jag brukar försöka googla en dag eller fler innan jag frågar här, även om den här sidan regerar. Jag är fortfarande riktigt imponerad av all kunskap och välvilja som finns här. Galet

Permalänk
Medlem

Haha!

Det var ju inte alls löst

Permalänk
Skrivet av JJ72:

Jag jobbar just nu på att försöka få ihop en "räknare". Dvs som kan räkna ihop banditerna
#1
Namn: Ma Baker
Nummer: 8766

Är det bara antalet fångar som finns i fängelset?
Kan du inte skriva list.size() så får du ut längden på din array.

Eller ska du skriva ut en siffra för varje bandit?
Ex:
1. Bandit1
2. Bandit2
osv...

Permalänk
Medlem
Skrivet av JJ72:

Fixat

import java.util.*; class Crooks{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); String name; int number; ArrayList<Bandit>list = new ArrayList<>(); System.out.println("Namn: "); name = scan.next(); System.out.println("Nummer"); number = scan.nextInt(); list.add(new Bandit(name, number)); list.add(new Bandit("Dalton", 1234)); list.add(new Bandit("Ma Baker", 6421)); for(int i =0; i <list.size(); i++){ // System.out.println("# " + (i+1)); for(Bandit b : list){ System.out.println("#" + (i+1) + "\n" + b); }} } }

Frågan nu blir ju, är det ok att ha for-looparna i main-klassen? Eller brukar det föredras att man har det i konstruktorn?
Jag är som sagt rätt långt ifrån kursen jag går, men jag vill gärna lära mig detta och jag pluggar bara för min egen skull (inget jobb eller så). Och ja, jag brukar försöka googla en dag eller fler innan jag frågar här, även om den här sidan regerar. Jag är fortfarande riktigt imponerad av all kunskap och välvilja som finns här. Galet

main-metoden är en bootstrap-metod och ska egentligen "bara" användas till att starta ditt program. För enklare program så finns inget behov av att krångla till det mer så tycker det ser bra ut som du har det.

Konstruktorn ska innehålla så lite "program" som möjligt; egentligen ska den bara se till att ditt objekt har vad det behöver för att fungera som det ska genom att sätta privata variabler, precis som du redan gör.

Problemet med din utskrift är att du loopar två gånger. Behåll din for (Bandit b : list) {... loop och öka på en variabel inuti loopen som representerar index

int banditNummer = 0; for (Bandit b : list) { banditNummer += 1; System.out.println("#" + banditNummer + ": " + b.toString()); ...

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Ooohhh.... så var det ja
Tack så mycket.

Nu har det kört ihop sig om jag vill ta bort skurkar...
Om jag gör som det första exemplet här, så går det ju bra.

import java.util.*; class Bov{ public static void main(String[] args) { ArrayList<String>arrlist = new ArrayList<String>(); arrlist.add("Dalton"); arrlist.add("Bonnie"); arrlist.add("Clyde"); System.out.println("Antal skurkar : " + arrlist.size()); for(String a : arrlist){ System.out.println("Skurk: " + a); } arrlist.remove("Dalton"); System.out.println("\nNytt antal skurkar: " + arrlist.size()); for(String value : arrlist){ System.out.println("Skurk: " + value); } } }

Men eftersom jag inte har <String> utan <Jagad> istället så får jag det inte att funka

Jag tyckte att det borde funka med

import java.util.ArrayList; class Bov{ public static void main(String[] args) { ArrayList<Jagad>arrlist = new ArrayList<Jagad>(); arrlist.add(new Jagad("Dalton", 1234)); arrlist.add(new Jagad("Ma Baker", 6421)); arrlist.add(new Jagad("Dillinger", 7533)); System.out.println("Antal skurkar : " + arrlist.size()); for(Jagad j : arrlist){ System.out.println("Skurk: " + j); } arrlist.remove(new Jagad("Dalton", 1234)); System.out.println("\nNytt antal skurkar: " + arrlist.size()); for(Jagad c : arrlist){ System.out.println("Skurk: " + c); } } }

Men icke! Någon som orkar förklara varför? (Ja, jag har en klass Jagad också ).

Permalänk

@JJ72:
arrlist.remove(new Jagad("Dalton", 1234));

När du gör en arrlist.remove så tar den bara emot ett index(plats) eller ett objekt.
Eftersom att du har add(new Jagad(namn, nr); så kan du t.ex. göra en for loop i en metod:

public void removeJagadWithId(int id) { Jagad taBortDettaObjekt; for(Jagad j : arrlist) { if(j.getId() == id) { taBortDettaObjekt = j; } } arrlist.remove(taBortDettaObjekt); }

Det går att göra på massvis med olika sätt.
eller:

public void removeJagadWithId(int id) { for(int i = 0; i < arrlist.size(); i++) { if(arrlist[i].id == id) { arrlist.remove(i); } } }

eftersom en forloop alltid kollar innan den går in så borde du inte få indexOutOfBounds här.

Hur som helst så hade jag fortfarande gjort en klass som innehåller en Map som har bovarnas id som nyckel och sen objektet som värde.
Eller om du bara ska ha två värden så räcker det med en map som har id och namn.

Ett bra sätt är att skriva ner vad du vill göra för något först och stryka under saker som är objekt. T.ex. Tjuv är ett objekt. Polis är ett annat, Fängelse är ett osv.

Vad kan en polis göra?
Fånga en tjyv? Det är en metod, t.ex:

class Police { public void catchTheif(Theif t) { prison.addTheifToPrison(t); } }

Från detta kan man bygga massvis som saker, som att tjyvar kan ha agility, har tjyven högre agility än polisen så kan han komma undan då kan man göra en funktion för det hos polis objektet.

Skriv lite i ett word dokument och fetmarkera alla OBJEKT och METODER. Så kanske du får en bättre översikt om vad du behöver och kan göra. Vill du ha hjälp skriv din "historia" här och posta den under.

Permalänk
Medlem
Skrivet av JJ72:

Ooohhh.... så var det ja
Tack så mycket.

Nu har det kört ihop sig om jag vill ta bort skurkar...
Om jag gör som det första exemplet här, så går det ju bra.

import java.util.*; class Bov{ public static void main(String[] args) { ArrayList<String>arrlist = new ArrayList<String>(); arrlist.add("Dalton"); arrlist.add("Bonnie"); arrlist.add("Clyde"); System.out.println("Antal skurkar : " + arrlist.size()); for(String a : arrlist){ System.out.println("Skurk: " + a); } arrlist.remove("Dalton"); System.out.println("\nNytt antal skurkar: " + arrlist.size()); for(String value : arrlist){ System.out.println("Skurk: " + value); } } }

Men eftersom jag inte har <String> utan <Jagad> istället så får jag det inte att funka

Jag tyckte att det borde funka med

import java.util.ArrayList; class Bov{ public static void main(String[] args) { ArrayList<Jagad>arrlist = new ArrayList<Jagad>(); arrlist.add(new Jagad("Dalton", 1234)); arrlist.add(new Jagad("Ma Baker", 6421)); arrlist.add(new Jagad("Dillinger", 7533)); System.out.println("Antal skurkar : " + arrlist.size()); for(Jagad j : arrlist){ System.out.println("Skurk: " + j); } arrlist.remove(new Jagad("Dalton", 1234)); System.out.println("\nNytt antal skurkar: " + arrlist.size()); for(Jagad c : arrlist){ System.out.println("Skurk: " + c); } } }

Men icke! Någon som orkar förklara varför? (Ja, jag har en klass Jagad också ).

Detta är ett rätt kul exempel, särskilt som du har satt upp det.

Först och främst: anledningen till att ditt exempel INTE fungerar är för att du gör arrlist.remove(new Jagad("Dalton", 1234)); Du skapar alltså ett nytt objekt av typen Jagad. Om du istället hade gjort nedanstående skulle det fungera:

Jagad jagad1 = new Jagad("Dalton", 1234); Jagad jagad2 = new Jagad("Ma Baker", 6421); Jagad jagad3 = new Jagad("Dillinger", 7533); arrlist.add(jagad1); arrlist.add(jagad2); arrlist.add(jagad3); // senare arrlist.remove(jagad1);

Anledningen till att ovanstående fungerar är att du inte har definierat en egen equals-metod på din Jagad-klass. En klass som inte implementerat sin egen equals-metod använder sig av objektreferensen för att se om objekt är likadana. Du har kanske tidigare upptäckt att new String("hej") == new String("hej") ger false; detta beror på precis samma sak: Vi har två strängar som innehåller samma tecken men som är två helt olika strängobjekt.

För att få ditt exempel att fungera behöver du sålunda implementera equals inuti din Jagad-klass. Det blir något åt det här hållet:

@Override public boolean equals(Object other) { if (other instanceof Jagad) { Jagad j2 = (Jagad) other; return j2.getName().equals(this.getName()) && j2.getId() == this.getId(); } return false; }

Ovan säger vi att ett godtyckligt objekt är samma objekt som Jagad-objektet det jämförs mot, om typen är rätt (instanceof Jagad), namnen är samma, och idt är samma.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

@for_each_while:

Kul läsning
Jag tackar så mycket och det du skriver är verkligen något jag ska ta till mig. Jag såg något liknande nån gång på youtube.... haha.

Mycket uppskattat iaf. Tack

Permalänk
Medlem

@Teknocide:

Ja, jag tyckte det kändes lite märkligt med remove(new Jagad)

Jäkligt bra formulerat iaf. Tackar så hemskt mycket

Permalänk
Medlem

Det där funkande ju fint

MEN..... om jag använder Scanner?

Jagad jagad1 = new Jagad("Dalton", 1234);
Jagad jagad2 = new Jagad("Ma Baker", 6421);
Jagad jagad3 = new Jagad("Dillinger", 7533);

arrlist.add(jagad1);
arrlist.add(jagad2);
arrlist.add(jagad3);

// senare
arrlist.remove(jagad1);

Ovan vet vi ju att det är jagad1 som ska bort. Men om jag vill välja tex Ma Baker med användarinput...? Hur skriver man då den sista raden?
print("Namn på fånge")
namn = input.nextLine();
namn = input.nextLine();
arrlist.remove(???????)

Tack så jättemycket för er hjälp

Permalänk
Skrivet av JJ72:

Det där funkande ju fint

MEN..... om jag använder Scanner?

Jagad jagad1 = new Jagad("Dalton", 1234);
Jagad jagad2 = new Jagad("Ma Baker", 6421);
Jagad jagad3 = new Jagad("Dillinger", 7533);

arrlist.add(jagad1);
arrlist.add(jagad2);
arrlist.add(jagad3);

// senare
arrlist.remove(jagad1);

Ovan vet vi ju att det är jagad1 som ska bort. Men om jag vill välja tex Ma Baker med användarinput...? Hur skriver man då den sista raden?
print("Namn på fånge")
namn = input.nextLine();
namn = input.nextLine();
arrlist.remove(???????)

Tack så jättemycket för er hjälp

Det skrev jag i min post där uppe

public void removeJagadWithId(int id) { Jagad taBortDettaObjekt; for(Jagad j : arrlist) { if(j.getId() == id) { taBortDettaObjekt = j; } } arrlist.remove(taBortDettaObjekt); }

byt ut int id mot String namn och skriv j.getName().equals(name) i if statsen inuti for loopen

Eller använd den andra for-loopen.

Annars kan du använda dig utav en map som jag skrev innan, så kan du använda IDt som nyckel. Eller namnet som nyckel.

Läs på lite om olika maps. TreeMap, HashMap osv. Det är ganska nyttigt att kunna. Byt ut arrlist mot Map<Key, Value>
t.ex.: Map<int, Jagad> prison = new HashMap<int, Jagad>();
Då använder du put() istället för add().
t.ex:
prison.put(jagad1.getId(), jagad1);

sen kan du skriva:
prison.remove(jagad1.getId());
så är han borta.

Försök skriva en text som jag sa, markera de orden med fetstil, de orden du tror är Objekt och metoder ett kort exempel är:

Fängelse:
Här ska alla tjuvar sparas om dom blir fångade av polisen.

Polis:
En polis kan fånga en tjuv och kasta han i fängelset, en polis är en person som har namn och ID på sin bricka och tillhör ett fängelse.

Tjuv:
En tjuv kan smita ifrån polisen, men kan också hamna i fängelse om polisen fångar honom, tjuven är en person som har ett namn och kanske ett fångnummer.

Person:
Personen har ett namn

Tjuv, Polis, Fängelse och Person är i detta fallet klasser.
Sen finns det lite metoder:
smita från polisen,
hamna i fängelse,
polisen fångar tjuven,
spara tjuven i fängelset

variabler:
Fängelset har en Map eller en lista med tjuvar. Har man något sånt borde man ha lite metoder: getTheifs(), hämta alla tjuvar, removeTheif() eller addThief().
polisen har ett namn, det har även tjuven. ( DUBBEL KOD, kan ärvas av klassen PERSON)
polisen har ett nummer på brickan, ALLTID. Det har inte tjuven, men han KANSKE har ett fång-nummer(?)
polisen tillhör även ett fängelse.

Då kommer vi snabbt in på arv. Men det är lite längre fram.
När du programmerar vill du försöka undvika att skriva dubbel kod. Dvs kod som gör samma sak två gånger. Då är det bättre att göra en funktion utav det, eller en klass om det är variabler.

T.ex. både polisen och tjuven är personer. Båda har ett namn, då kan tjuv och polis ärva av person. Men det är som sagt överkurs.

Sen gäller det bara att hitta vart alla metoder platsar, vem ska ha metod x och vem ska ha metod y. Vad ska ärvas?

Hoppas det hjälpt lite mer.

Permalänk
Medlem
Skrivet av JJ72:

Det där funkande ju fint

MEN..... om jag använder Scanner?

Jagad jagad1 = new Jagad("Dalton", 1234);
Jagad jagad2 = new Jagad("Ma Baker", 6421);
Jagad jagad3 = new Jagad("Dillinger", 7533);

arrlist.add(jagad1);
arrlist.add(jagad2);
arrlist.add(jagad3);

// senare
arrlist.remove(jagad1);

Ovan vet vi ju att det är jagad1 som ska bort. Men om jag vill välja tex Ma Baker med användarinput...? Hur skriver man då den sista raden?
print("Namn på fånge")
namn = input.nextLine();
namn = input.nextLine();
arrlist.remove(???????)

Tack så jättemycket för er hjälp

Det var precis det här jag besvarade i mitt förra svar. Du behöver overrida equals-metoden på din Jagad-klass. Scrolla upp och läs igen

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Duh... Det gäller ju att kunna läsa också, haha.

Tack ska du ha

Permalänk
Medlem

@for_each_while:
Grymt bra. Tack så jättemycket

Permalänk
Medlem

Men va f*******n
Nu har jag hållit på med samma sak sedan igår

Någonstans blir det ändå fel. Jag lyckas ta bort en bov, men jag kan inte välja vilken.

Jag tycker jag provat med allt nu. Det ni sagt åt mig, googlat, youtube, egna varianter.....
Allt går toppen om jag i förväg vet vem som skall tas bort. Men så fort användaren ska mata in vem som ska bort så kör det ihop sig

Jag har även provat med HashMap, vilket verkar vara rätt coolt. Måste bara läsa på lite om det

Permalänk
Medlem
Skrivet av JJ72:

Men va f*******n
Nu har jag hållit på med samma sak sedan igår

Någonstans blir det ändå fel. Jag lyckas ta bort en bov, men jag kan inte välja vilken.

Jag tycker jag provat med allt nu. Det ni sagt åt mig, googlat, youtube, egna varianter.....
Allt går toppen om jag i förväg vet vem som skall tas bort. Men så fort användaren ska mata in vem som ska bort så kör det ihop sig

Ingen kod, ingen hjälp.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av JJ72:

Men va f*******n
Nu har jag hållit på med samma sak sedan igår

Någonstans blir det ändå fel. Jag lyckas ta bort en bov, men jag kan inte välja vilken.

Jag tycker jag provat med allt nu. Det ni sagt åt mig, googlat, youtube, egna varianter.....
Allt går toppen om jag i förväg vet vem som skall tas bort. Men så fort användaren ska mata in vem som ska bort så kör det ihop sig

Jag har även provat med HashMap, vilket verkar vara rätt coolt. Måste bara läsa på lite om det

Du har fått svaret av mig, 2 olika sätt i samma kommentar.

Permalänk
Medlem

Haha.
Ok, häng en sekund

Permalänk
Medlem

Jag har skrivit och tagit bort så många gånger nu att jag vet knappt ut eller in längre. Det här är som det är i just detta ögonblick (vet inte ens om något funkar i detta läge).

Jag är verkligen lessen att jag är en idiot inom detta :-/

import java.util.*; class Crooks{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); String name; int number, choice; ArrayList<Bandit>list = new ArrayList<>(); Bandit bandit1 = new Bandit("Dalton", 5325); Bandit bandit2 = new Bandit("Ma Baker", 9864); Bandit bandit3 = new Bandit("Dillinger", 2452); list.add(bandit1); list.add(bandit2); list.add(bandit3); System.out.println("Välkommen till FÄNGELSET!!!\n"); System.out.println("Antal skurkar: " + list.size()); do{ System.out.println("Vänligen ange vad ni vill göra: \n1) Lägg till fånge \n2) Ta bort fånge \n3) Lista aktiva fångar \n4) Lista borttagna fångar \n5) Avsluta"); choice = scan.nextInt(); switch(choice){ case 1: do{ System.out.println("Mata in uppgifter på den nya fången."); System.out.println("Namn: "); name = scan.nextLine(); name = scan.nextLine(); System.out.println("Nummer: "); number = scan.nextInt(); list.add(new Bandit(name, number)); System.out.println("Vill du mata in fler? \n1) Ja \n2) Nej"); choice = scan.nextInt(); }while(choice == 1); break; case 2: System.out.println("\nIntagna fångar: " + list.size()); for(Bandit b : list){ System.out.println(b.toString());} System.out.println("Nummer på den ni vill ta bort: "); number = scan.nextInt(); list.remove(number); //Här har jag ändrat så många gånger nu. Tagit bort det mesta, så bara detta är kvar break; case 3: int banditNummer = 0; System.out.println("\nAntal fångar: " + list.size()); for(Bandit b : list){ banditNummer += 1; System.out.println("#" + banditNummer + "\n" + b.toString());} break; } }while(choice != 5); System.out.println("Välkommen åter!"); } } import java.util.ArrayList; import java.util.*; class Bandit{ ArrayList<Bandit>list = new ArrayList<>(); private String name; private int number; public Bandit(String name, int number){ this.name = name; this.number = number; } public String getName(){ return this.name; } public int getNumber(){ return this.number; } public void removeBanditWithId(int number) { //provade även med detta... Bandit taBortDettaObjekt; for(Bandit b : list) { if(b.getNumber() == number) { taBortDettaObjekt = b; } } } public String toString(){ return "Namn: " + this.name + "\nNummer: " + this.number + "\n"; } @Override public boolean equals(Object other){ if(other instanceof Bandit){ Bandit b = (Bandit) other; return b.getName().equals(this.getName()) && b.getNumber() == (this.getNumber()); } return false; } }

Permalänk
Medlem
Skrivet av JJ72:

Jag har skrivit och tagit bort så många gånger nu att jag vet knappt ut eller in längre. Det här är som det är i just detta ögonblick (vet inte ens om något funkar i detta läge).

Jag är verkligen lessen att jag är en idiot inom detta :-/

import java.util.*; class Crooks{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); String name; int number, choice; ArrayList<Bandit>list = new ArrayList<>(); Bandit bandit1 = new Bandit("Dalton", 5325); Bandit bandit2 = new Bandit("Ma Baker", 9864); Bandit bandit3 = new Bandit("Dillinger", 2452); list.add(bandit1); list.add(bandit2); list.add(bandit3); System.out.println("Välkommen till FÄNGELSET!!!\n"); System.out.println("Antal skurkar: " + list.size()); do{ System.out.println("Vänligen ange vad ni vill göra: \n1) Lägg till fånge \n2) Ta bort fånge \n3) Lista aktiva fångar \n4) Lista borttagna fångar \n5) Avsluta"); choice = scan.nextInt(); switch(choice){ case 1: do{ System.out.println("Mata in uppgifter på den nya fången."); System.out.println("Namn: "); name = scan.nextLine(); name = scan.nextLine(); System.out.println("Nummer: "); number = scan.nextInt(); list.add(new Bandit(name, number)); System.out.println("Vill du mata in fler? \n1) Ja \n2) Nej"); choice = scan.nextInt(); }while(choice == 1); break; case 2: System.out.println("\nIntagna fångar: " + list.size()); for(Bandit b : list){ System.out.println(b.toString());} System.out.println("Nummer på den ni vill ta bort: "); number = scan.nextInt(); list.remove(number); //Här har jag ändrat så många gånger nu. Tagit bort det mesta, så bara detta är kvar break; case 3: int banditNummer = 0; System.out.println("\nAntal fångar: " + list.size()); for(Bandit b : list){ banditNummer += 1; System.out.println("#" + banditNummer + "\n" + b.toString());} break; } }while(choice != 5); System.out.println("Välkommen åter!"); } } import java.util.ArrayList; import java.util.*; class Bandit{ ArrayList<Bandit>list = new ArrayList<>(); private String name; private int number; public Bandit(String name, int number){ this.name = name; this.number = number; } public String getName(){ return this.name; } public int getNumber(){ return this.number; } public void removeBanditWithId(int number) { //provade även med detta... Bandit taBortDettaObjekt; for(Bandit b : list) { if(b.getNumber() == number) { taBortDettaObjekt = b; } } } public String toString(){ return "Namn: " + this.name + "\nNummer: " + this.number + "\n"; } @Override public boolean equals(Object other){ if(other instanceof Bandit){ Bandit b = (Bandit) other; return b.getName().equals(this.getName()) && b.getNumber() == (this.getNumber()); } return false; } }

Du skickar in ett nummer i remove-metoden, vilket innebär att du försöker ta bort ett element på ett visst index. Du behöver skicka in ett komplett bandit-objekt för att equals ska fungera.

removeBanditWithId(...) tar bort banditer från objektets interna lista, vilken alltid är tom. Det ska inte ens finnas en intern lista i Bandit så den kan du ta bort. För att det ska fungera behöver du ha den i din andra klass, där själva listan finns.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

@JJ72:
Först och främst så ber du om fångens namn 2 ggr.

System.out.println("Mata in uppgifter på den nya fången."); System.out.println("Namn: "); name = scan.nextLine(); name = scan.nextLine();

Sen så skriver du så här:

case 2: System.out.println("\nIntagna fångar: " + list.size()); for(Bandit b : list){ System.out.println(b.toString()); } System.out.println("Nummer på den ni vill ta bort: "); number = scan.nextInt(); list.remove(number); //Här har jag ändrat så många gånger nu. Tagit bort det mesta, så bara detta är kvar break;

Du ber om ett nummer. Men du loopar igenom alla banditer och får deras fångenummer. Det kan du inte använda dig utav att ta bort banditer, det är en medlemsvariabel som bara banditer har, har du ingen referens dit så kan du inte ta bort den på det viset.

Det du vill göra är en vanlig forloop:

for(int index = 0; index < list.size(); index++) { System.out.println("Index: " + index + ": " + list[i].toString()); }

Sen får användaren mata in indexen som du vill ta bort.

System.out.println("Nummer på den ni vill ta bort: "); number = scan.nextInt(); list.remove(number); // number blir index i det här fallet

Permalänk

En annan bra sak för nytt folk. Se till att ni skriver konsekvent!
Följ standarden. Har du t.ex. eclipse mars, den nya så är det ctrl+shift+F för att formatera koden. Sen till att alltid försöka skriva så likt det som möjligt.
I längden blir allt mer lättläst, går snabbare att hitta felen, för någon annan blir koden mer lättläslig.

Permalänk
Medlem

@Teknocide:
Ahaa. Jag tänkte att om jag sätter det till variabeln 'number' så funkar det, men det blir alltså indexet ändå.

Tack