arraylista till konstructor java

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

arraylista till konstructor java

Hej alla!

Jag försöker skriva ett program med en arraylista där jag ska lagra allt i en annan klass.
Jag har inga problem att göra en arraylista, inte heller att göra två klasser. Men det körde ihop sig då jag skulle kombinera de två.

Som exempel försökte jag med tex bara namn eller namn och ålder.

Några förslag eller tips?

Tack för din tid

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Något sådant?

import java.util.ArrayList; class author{ public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("Johan"); names.add("Karl"); Writer writerObject = new Writer(names); writerObject.info(); } } import java.util.ArrayList; public class Writer{ private ArrayList<String> names; public Writer(ArrayList<String> names){ this.names = names; } public ArrayList<String> getNames(){ return names; } public void setNames(String name){ this.names = names; } public void info(){ System.out.println("Namn: " + getNames()); } }

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Det kör ju ihop sig om jag lägger till int

Försöker göra ett bokexempel. Detta är utanför kursen jag går och jag har väldigt svårt att hitta något användbart på nätet...

import java.util.ArrayList; class author{ public static void main(String[] args) { ArrayList<Writer> names = new ArrayList<Writer>(); int ISBN; Writer johan = new Writer("Johan", 1234); Writer karl = new Writer("Karl", 4567); names.add(johan); names.add(karl); Writer writerObject = new Writer(names,ISBN); writerObject.info(); } } import java.util.ArrayList; public class Writer{ private String names; private int ISBN; public Writer(ArrayList<Writer> names, int ISBN){ // this.names = names; this.ISBN = ISBN; } public String getNames(){ return names; } public void setNames(String names){ this.names = names; } public int getISBN(){ return ISBN; } public void setISBN(int ISBN){ this.ISBN = ISBN; } public void info(){ System.out.println("Namn: " + getNames() + "Nummer: " + getISBN()); } }

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Dina code-taggar verkar inte fungera, du skall ha en [CODE] i början och en [./CODE] i slutet (utan punkt).

Jag är inte helt säker på vad du vill göra med din kod, du har en klass Writer som du använder för två helt olika saker. Dels verkar den representera en författare(?) med ett namn och ett ISBN, dels verkar den representera en samling författare.

Du får lov att precicera va du vill göra med klassen.

Trädvy Permalänk
Medlem
Plats
Vid datorn
Registrerad
Aug 2006

Som koden ser ut nu så ser det ut som du försöker lagra både en lista med namn i din writer, och ett isbn, och en writer per person.

Du får bestämma vad du faktiskt vill lagra i din Writer klass. Kollar du på konstruktorn som den ser ut just nu tar du in en ArrayList<Writer> i konstruktorn som du inte lagrar.

Du har även setNames som endast tar in en String när den borde ta in någon form av lista med Strings (så den kan ta in flera namn) eller ändras till setName (för att lagra ett namn endast).

Till exempel skulle vissa metoder kunna se ut såhär

public Writer(ArrayList<String> names, int isbn){ this.names = names; this.isbn = isbn; } public void addName(String name){ this.names.add(name); } public void addNames(ArrayList<String> namesToAdd){ this.names.addAll(namesToAdd); } public ArrayList<String>getNames(){ return names; }

Detta är bara skrivet direkt här i sweclockers så har inte testat så jag skrivit rätt eller så men bör ge en ungefärlig uppfattning om hur det skulle kunna se ut.

In the end what separates a man from a slave?
Money? Power? No... A man chooses, a slave obeys.
ASUS Z170M-PLUS || Intel Core i7 6700k @ 4,7GHz || 64GB 2133MHz Corsair RAM || EVGA NVIDIA GTX 1080 8GB @ 2,0Ghz || Bifenix Prodigy M || 2x CZ TR150 480GB RAID 0 || EK-CoolStream PE 120 & 240, Radiatorer || EK-DDC 3.2 PWM, Pump || EK-Supremacy MX & EK-FC1080 GTX, Vattenblock || 3x BenQ 24", Skärmar

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Ah, jag hade satt code taggen / efter istället för före code. Jag ska tänka på det framöver.

Jag hade väl hoppats på något i stil med

Namn1
1234

Namn2
4567

Men så blev det ju inte. Haha.

Jag ska kolla det du skrivit lollol7 Tack

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Hmm... "Type missmatch: cannot convert from ArrayList<String> to String"

Jag får prova mig fram....

tack

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2008
Skrivet av JJ72:

Hmm... "Type missmatch: cannot convert from ArrayList<String> to String"

Jag får prova mig fram....

tack

Hänger inte riktigt med vad du har försökt göra tidigare, men vad är det som du försöker göra nu? Kan du visa lite kodexempel på vart det strular.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Jag hade tänkt skriva en kod som matar ut till exempel:

Namn: Kalle
ISBN: 1234

Namn: Olle, Pelle
ISBN: 4567

och till detta skulle en array eller arraylist användas, samt även två klasser.
Jag funderade på huruvida man kan skriva både namn och nummer i samma arraylist, eller måste man hitta på något annat.
Exemplet kommer från en kurs, men där räcker det med att man har namnen i en array eller arraylist, det var bara något jag kom på att det kanske går att ha olika variabler i "samma" lista.

typ; ArrayList<String><Integer>list = new ArrayList<String><Integer>();
Nu funkar ju inte koden ovan, men det är ett exempel på hur jag funderar. Är jag helt ute och cyklar här kanske? Man måste ju prova

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Det där fungerar tyvärr inte, men det finns några lösningar. Kanske det enklaste är att använda en "map", som så att säga mappar ett värde till ett annat. En map har nycklar som måste vara unika, och ett värde för varje nyckel. Ett exempel är HashMap, då kunde du ha

Map<String, Integer> names = new HashMap<String, Integer>(); names.put("Olle", 1234);

Märk som sagt att du då inte kan ha flera personer med samma namn. Ett annat alternativ är att ha en ArrayList bestående av räckor (array) av längden två, där det första elementet är namnet och det andra ISBN-numret. Då måste bägge vara av samma typ, d.v.s. String.

ArrayList<String[]> names = new ArrayList<String[]>(); names.add(new String[]{"Kalle", "1234"}); names.add(new String[]{"Olle", "4567"});

Det kanske bästa alternativet är att göra en skild klass för författare, så som du verkar har gjort i början. Du kan dock inte använda samma klass för att lagra elementen, såvida du inte har en statisk lista för dessa (statisk innebär gemensam för alla instanser av klassen).

class Writer { static ArrayList<Writer> names = new ArrayList<Writer>(); String name; int ISBN; public Writer(String name, int ISBN) { this.name = name; this.ISBN = ISBN; // Spara personen i klassens gemensamma lista names.add(this); } public void printName() { System.out.println(this.name); } public static void printNames() { for(Writer w: names) { System.out.println(w.name); } } }

Så nu har du något att fundera på. Din type mismatch från tidigare är ganska uppenbar, du har en konstruktor som tar en ArrayList, och ibland ger du den en ArrayList, ibland en String.

OBS: Har inte testat koden ovan, kan finnas skrivfel.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Wow! Grymt

Jag satt och knåpade på följande (allt är dock i samma klass. Mest bara för att testa). Det jag inte fick ihop var utskriften. Vill ju att bok 1 har författare och isbn sedan bok 2 med författare och isbn osv.

import java.util.ArrayList; class Books{ public static void main(String[] args) { ArrayList <String> names = new ArrayList<String>(); ArrayList <Integer> isbn = new ArrayList<Integer>(); int counter = 0; names.add(0,"John Smith,"+" The Mauler"); names.add(1, "Leonidis"); names.add(2, "Mrs Robinson, " + "Wolverine, " + "Jack Daniels"); isbn.add(0, 1234); isbn.add(1, 4567); isbn.add(2, 7890); for(int i =0; i <names.size(); i++){ counter++; System.out.println("Författare Bok " + counter + ": " + names.get(i)); } for(int j =0; j <isbn.size(); j++){ System.out.println("ISBN: " + isbn.get(j)); } } }

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Två kommentarer:

Jag tror inte du behöver counter, du kan ju ersätta den med (i + 1):

for(int i =0; i <names.size(); i++){ System.out.println("Författare Bok " + (i+1) + ": " + names.get(i)); }

Sedan kan du ju lägga bägge utskrifter i samma for-loop (såvida du vet att names och isbn har samma längd)

for(int i =0; i <names.size(); i++){ System.out.println("Författare Bok " + (i+1) + ": " + names.get(i) + ", ISBN: " + isbn.get(i)); }

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Skrev ett litet program du kan köra om du vill, kom ihåg att filen måste heta "Test" då klassen "Test" är public, eller så får du döpa om den. Koden nedanför är testad och fungerar.

import java.util.ArrayList; public class Test { public static void main(String[] args) { // Skapa en bok som vi sparar referens till Book book1 = new Book("Män som hatar C++", "Steve Jobs", 1234567); /* * En till bok som vi inte sparar en referens till, men eftersom vi i konstruktorn för klassen * Book sparar den i listan allBooks kan vi ändå skriva ut den med printAllBooksInfo() */ new Book("Sagan om Windows", "Bill Gates", 13371337); // Skriv ut den första boken book1.printInfo(); // Skriv ut alla böcker Book.printAllBooksInfo(); } } class Book { static ArrayList<Book> allBooks = new ArrayList<Book>(); String title; String author; int isbn; public Book(String title, String author, int isbn) { this.title = title; this.author = author; this.isbn = isbn; allBooks.add(this); } public void printInfo() { System.out.println("Title: " + title + "\nAuthor: " + author + "\nISBN: " + isbn + "\n"); } public static void printAllBooksInfo() { for(int i = 0; i < allBooks.size(); i++) { System.out.println("Book " + (i+1) + ":\nTitle: " + allBooks.get(i).title + "\nAuthor: " + allBooks.get(i).author + "\nISBN: " + allBooks.get(i).isbn + "\n"); } } }

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Aaahhh.... jag ska kolla detta direkt

Tack så jättemycket

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Det där var ju grym.

Det knöt ihop säcken riktigt bra
Jag hade en massa kodstycken, men fick inte riktigt ihop dem med varandra. Nu TROR jag att det klarnade ordentligt (snart kommer jag väl med en ny fråga bara för det, haha). Jag upplever iaf att jag förstår hela ArrayList-biten mycket bättre nu. Jag kopierar ju inte bara koden, utan skriver den istället. Tycker att jag lär mig mkt bättre av det än att bara stirra på den, haha.

Galet tacksam

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Nu är jag här igen haha!

Jag provade att lägga till ett pris på boken och det var ju inga problem. Men låt säga att jag vill köpa en eller flera av böckerna, hur skulle jag göra då? Jag provade med enhanced forloops, men det jag inte riktigt reder ut är ju att få ut just priset ur listan.

Ska man skriva priset "vid sidan av" arraylistan, eller går det att räkna priset ändå?

Någon form av map kanske?

Så här ser det ut nu:

import java.util.ArrayList; class author{ public static void main(String[] args) { Book book1 = new Book("Boken om Java", "Jack Daniels", 1234567, 150); new Book("Nationalencyklopedin, del2", "Kalle Kola, Hunter S. Thompson", 1357902, 210); new Book("Dobermann Gang", "John Dillinger, Ma Baker, Clyde Barrow", 2468013, 340); book1.printInfo(); Book.printAllBooksInfo(); } } import java.util.ArrayList; public class Book { static ArrayList<Book> allBooks = new ArrayList<Book>(); String title; String author; int isbn; int price; public Book(String title, String author, int isbn, int price){ this.title = title; this.author = author; this.isbn = isbn; this.price = price; allBooks.add(this); } public void printInfo(){ System.out.println("Titel: " + title + "\nFörfattare: " + author + "\nISBN: " + isbn + "\nPris: " + price + " kr"); } public static void printAllBooksInfo(){ for(int i = 0; i<allBooks.size(); i++){ System.out.println("Bok " + (i+1) + "\nTitel: " + allBooks.get(i).title + "\nFörfattare: " + allBooks.get(i).author + "\nISBN: " + allBooks.get(i).isbn +"\nPris: " + allBooks.get(i).price + " kr\n"); } } }

Tack för hjälpen

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Vad vill du att händer då du köper en eller flera böcker, och hur matar du in vilken bok du vill köpa?

Väljer du bok enligt index i listan?

Book.buyBook(3);

Enligt referens?

Book book1 = new Book(blabla); book1.buy();

Enligt titel/isbn?

Book.buyBook(123543);

Vad ska sedan hända? Skall boken försvinna ur listan? Skall du få ett sammanlagt pris? Du får lov att specificera lite

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

hmm...

För enkelhetens skull så skippar vi scan och allt sånt.

Låt säga att jag vill slå ihop summan av böckerna

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Ursäkta, gjorde en liten ändring i mitt tidigare inlägg.

Okej, då måste du fundera ut hur du vill mata in alla böcker du vill köpa?

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Ja du...

Eftersom jag är osäker på hur man gör för att hitta priset i listan, så kan jag inte riktigt svara.

Jag tänkte man kunde få en utskrift som tidigare plus kanske en rad

"Böckerna kostar tillsammans: 12345 kr."

Men om du vill visa hur jag kan söka på olika sätt så vore det ju kanon

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Fast då kan man ju såklart använd scan. Jag har absolut inget emot det

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Sitter på föreläsning så hinner inte testa kod, men kan ge några alternativ me otestad kod

Först räkna priset i samband med utskrift

public static void printAllBooksInfo(){ int sum = 0; for(int i = 0; i<allBooks.size(); i++){ System.out.println("Bok " + (i+1) + "\nTitel: " + allBooks.get(i).title + "\nFörfattare: " + allBooks.get(i).author + "\nISBN: " + allBooks.get(i).isbn +"\nPris: " + allBooks.get(i).price + " kr\n"); // Lägg till priset till summan sum += allBooks.get(i).price; } // Skriv ut summan efter for-loopen System.out.println("Böckerna kostar totalt " + sum + " kronor."); }

Eller med enhanced for-loop

public static void printAllBooksInfo(){ int sum = 0; int counter = 1; for(Book book: allBooks) { System.out.println("Bok " + counter + "\nTitel: " + book.title + "\nFörfattare: " + book.author + "\nISBN: " + book.isbn + "\nPris: " + book.price + "kr\n"); sum += book.price; } // Skriv ut summan efter for-loopen System.out.println("Böckerna kostar totalt " + sum + " kronor."); }

Att söka efter ett objekt är ganska lätt, att söka efter ett objekt med en viss egenskap är lite lite svårare. Det lättaste sättet är helt enkelt att loopa igenom:

public void printPrice(String title) { for(Book b: allBooks) { if(b.title.equals(title)) System.out.println("Boken " + b.title + " kostar " + b.price + " kronor."); } }

Kom ihåg att du kan jämföra primitiva typer (int, boolean, float o.s.v.) med ==, men objekt skall oftast jämföras med equals (String är ett objekt, därför börjar String med stor bokstav). Så pris skulle istället vara if(b.price == price).

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Jag tackar så ödmjukast.

Nu har jag lite att jobba med.

Jag är otroligt tacksam

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Kul att kunna hjälp till.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Det där var ju grymma grejer

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Hmm... jag kommer på nya grejer hela tiden. Haha

Jag har funderat lite på hur jag skulle göra om jag använder en scanner. Låt säga att jag har en bokaffär och köper in böcker då och då. Då vill jag ju kunna lägga till dem till listan (inget lagersaldo eller så att fundera över än. En sak i taget ).
Frågan är hur jag ska få in info i arraylistan.
Som det är nu så får jag inte ens enklaste input att fungera

import java.util.*; class author{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); int choice; String title; System.out.println("Vad vill du göra? \n1) Lägga till ny bok \n2) Visa böcker"); choice = scan.nextInt(); switch(choice){ case 1: System.out.println("Mata in titel: "); title = scan.nextLine(); break; case 2: Book book1 = new Book("Sagan om Java", "Jack Daniels", 1234567, 150); new Book("Nationalencyklopedin, del2", "Kalle Kola, Hunter S. Thompson", 1357902, 210); new Book("Dobermann Gang", "John Dillinger, Ma Baker, Clyde Barrow", 2468013, 340); break; } Book.printAllBooksInfo(); } } import java.util.ArrayList; public class Book { static ArrayList<Book> allBooks = new ArrayList<Book>(); String title; String author; int isbn; int price; public Book(String title, String author, int isbn, int price){ this.title = title; this.author = author; this.isbn = isbn; this.price = price; allBooks.add(this); } public static void printAllBooksInfo(){ for(int i = 0; i<allBooks.size(); i++){ System.out.println("Bok " + (i+1) + "\nTitel: " + allBooks.get(i).title + "\nFörfattare: " + allBooks.get(i).author + "\nISBN: " + allBooks.get(i).isbn +"\nPris: " + allBooks.get(i).price + " kr\n"); } } }

Tack för hjälpen

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Hmm....

Får det inte att funka som jag vill

Nu lyckas jag mata in info, men inte namnet, bara siffrorna.

import java.util.*; class test{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); String title; int idnumber, choice; int amount =0; System.out.println("Vad vill du göra? \n1) Lägga till ny bandit \n2) Visa interner"); choice = scan.nextInt(); switch(choice){ case 1: do{ System.out.println("Namn: "); title = scan.nextLine(); System.out.println("Fångnummer: "); idnumber = scan.nextInt(); System.out.println("Lägg till fler? \n1. Ja\n2. Nej "); amount = scan.nextInt(); Crook crook1 = new Crook(title, idnumber); }while(amount == 1); break; case 2: Crook.printAllCrooksInfo(); break; } Crook.printAllCrooksInfo(); } } import java.util.ArrayList; public class Crook { static ArrayList<Crook> allCrooks = new ArrayList<Crook>(); String title; int idnumber; public Crook(String title, int idnumber){ this.title = title; this.idnumber = idnumber; allCrooks.add(this); } public static void printAllCrooksInfo(){ for(int i = 0; i<allCrooks.size(); i++){ System.out.println("\nNamn: " + allCrooks.get(i).title + "\nFångnummer: " + allCrooks.get(i).idnumber); } } }

Obs!
Koden är slarvig, men jag försöker bara få det att funka till att börja med.

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Hej igen!

En liten bi-fråga först, har du dina klasser i olika filer? Annars kan du inte ha din import mellan klasserna, men du har dem säkert i olika.
Dessutom skulle jag föredra att ha klassen med main-metoden public, då main-metoden i så fall hittas automatiskt då filen körs.

Hur som helst, över till ditt problem.

Lite Googlande på problemet visar att scan.nextInt() inte 'konsumerar' radbrytning. I stället läses den av nästa scan.nextLine(), som konsumerar den och inte låter användaren mata in något.

Tänk dej att skannern har ett matbord framför sig. Du säger åt den att äta nästa siffra, och matar in siffran 9 följt av enter. Den äter glatt upp 9:an, men radbrytningen efter 9:an blir kvar på bordet. Du säger åt den att äta nästa radbrytning, men eftersom den redan har en kvar på bordet äter den upp den och du har aldrig möjligheten att mata in något nytt.

Lösning? Du kan efter en scan.nextInt() ha en scan.nextLine() som du inte sparar, utan ändast "äter upp" den extra radbrytningen.
Ett annat alternativ är att läsa in alla värden med scan.nextLine(), och konvertera dem till siffror o.dyl. efteråt.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Tjenare

Jag har dem i olika klasser. Tyckte bara det var enklare att skriva koden som jag gjorde.

Jag tror jag löste precis det hela, genom att ta bort "Line" i nextLine()

import java.util.*; class Inmate{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); String Name; int Number, choice; int amount =0; System.out.println("Vad vill du göra? \n1) Lägga till ny bandit \n2) Visa interner"); choice = scan.nextInt(); switch(choice){ case 1: do{ System.out.println("Namn: "); Name = scan.next(); System.out.println("Fångnummer: "); Number = scan.nextInt(); System.out.println("Lägg till fler? \n1. Ja\n2. Nej "); amount = scan.nextInt(); Bandit bandit1 = new Bandit(Name, Number); }while(amount == 1); break; case 2: Bandit.printAllBanditsInfo(); break; } Bandit.printAllBanditsInfo(); } } import java.util.ArrayList; public class Bandit{ static ArrayList<Bandit> allBandits = new ArrayList<Bandit>(); String Name; int Number; public Bandit(String Name, int Number){ this.Name = Name; this.Number = Number; allBandits.add(this); } public static void printAllBanditsInfo(){ for(int i = 0; i<allBandits.size(); i++){ System.out.println("\nNamn: " + allBandits.get(i).Name + "\nFångnummer: " + allBandits.get(i).Number); } } }

Men borde man inte kunna ha ArrayListan i main-klassen?

Tack för din hjälp

Trädvy Permalänk
Medlem
Registrerad
Okt 2015

@JJ72: Gör en klass som heter Prison t.ex:

class Prison { String name; Map<int, Inmate> inmates = new HashMap<int, String>(); Prison(String name) { this.name = name; } public void addInmate(Inmate inmate) { inmates.add(inmate.getNumber(), inmate); } public void removeInmate(int number) { inmates.remove(number); } public void printAllInmates() { for(Inmate i : inmates.value()) { System.out.println("ID: " + i.getNumber() + "\nName: " + i.getName()); } } }

Sen kan du skapa nya inmates och lägga till dom i fängelset.
i main t.ex.

public static void main(String args[]) { Prison prison = new Prison("Alcatraz"); Inmate inmate1 = new Inmate(1234, "Dalton"); Inmate inmate2 = new Inmate(4321, "Al Capone"); prison.addInmate(inmate1); prison.addInmate(inmate2); prison.printAllInmates(); }

Sen kan du skapa upp hur många olika fängelser du vill. Du kan även i din Inmate klass lägga in en statisk variabel som ID som ökar varje gång du lägger till en inmate.

class Inmate { private static int number = 1; private int id; private String name; public Inmate(String name) { this.id = number; this.name = name; number++; } public String getName() { return this.name; } public int getId() { return id; } }

Jag har inte orkat kolla om detta är korrekt syntax, finns säkert fel överallt i min kod ovanför, men det kanske hjälper något iaf.
Jag är lite osäker på om hela static id grejen funkar. Men det finns säkert något sätt att få det att funka.

Hoppas det hjälper lite.