Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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!!!!

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Mar 2012

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();

(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))

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Awsome!!!

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

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2004

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); }

"Happiness is only real when shared"

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Haha!

Det var ju inte alls löst

Trädvy Permalänk
Medlem
Registrerad
Okt 2015
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...

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
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()); ...

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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å ).

Trädvy Permalänk
Medlem
Registrerad
Okt 2015

@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.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
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.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

@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

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

@Teknocide:

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

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

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Trädvy Permalänk
Medlem
Registrerad
Okt 2015
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.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
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

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Tack ska du ha

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
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.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Okt 2015
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.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Haha.
Ok, häng en sekund

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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; } }

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
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.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Okt 2015

@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

Trädvy Permalänk
Medlem
Registrerad
Okt 2015

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.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

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

Tack