Java: lägga objekt i en vector

Trädvy Permalänk
Medlem
Registrerad
Jul 2005

Java: lägga objekt i en vector

Hejsan!

Jag har lite problem, jag har en lista med antal personer lista.txt som ska läsas in

Formatet på textfilen är:

alias
fullName
lastIP

jag vill sedan kunna lägga varje person i en vector och sedan kunna loopa igenom vectorn och skriva ut varje alias och fullName.

Jag är van att med c++ kunna skapa en struct, tilldela attributen värden, och sedan lägga dom i vector.
jag försöker att med Java härma en Struct, genom att skapa ett objekt med variablar och lägga objektet i en vector
Problemet är att när jag ska ändra värden i "structen" eller rättare sagt objektet så ändras värdena för alla objekt

MAIN
--------

Vector<MyClass> friends = new Vector<MyClass>(); MyClass dataFields = new MyClass(); dataFields.alias = "ALIAS1"; dataFields.fullName = "namn1"; dataFields.lastIP = "1.1.1.1.1"; friends.add(dataFields); dataFields.alias = "ALIAS2"; dataFields.fullName = "NAMN2"; dataFields.lastIP = "2.2.2.2.2"; friends.add(dataFields); System.out.println("\n\t\t------->Size: "+friends.size()+"<------\n"); //2 System.out.println(friends.get(0).alias ); System.out.println(friends.get(1).alias );

----------------------------

public class MyClass //like c++ Struct { public String alias; public String fullName; public String lastIP; }

----------------------------

CONSOLE
------>Size: 2<------
ALIAS2
ALIAS2

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Mar 2013

Du lägger till samma instans av datafield, om jag inte missminner mig så funkar alla variablar ungefär som "pekare" eller referenser till en instans i Java.

Trädvy Permalänk
Medlem
Plats
LUND
Registrerad
Aug 2011

Du behöver göra en "new MyClass();" för varje objekt du vill lägga till i listan. Nu skapar du bara ett objekt som båda platserna i listan pekar på.

MS-7673 | i5-2500K @ 4.4Ghz | GTX 670 @ ~1.3GHz | Corsair 8GB VENGEANCE LP | Corsair AX 860W 80+ Platinum | Fractal Design R4

Trädvy Permalänk
Medlem
Registrerad
Jul 2005
Skrivet av djwalle:

Du behöver göra en "new MyClass();" för varje objekt du vill lägga till i listan. Nu skapar du bara ett objekt som båda platserna i listan pekar på.

säg att jag har en lista med 100 personer , varje person har alias,namn,lastIP och jag vill lägga till varje person i vectorn
hur gör jag detta?

att jag måste skapa nytt objekt för varje person förstår jag men hur gör jag det per automatiskt i en loop

finns det någon annan datastruktur, någon map eller annat som jag kan lagra 4st variablar på samma position? multidimensionell vector?

lista[position].alias
lista[position].fullName

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

En stor skillnad mellan C++ och Java/C# är att C++ kod ofta jobbar med data "by-value" medan de andra två typiskt jobbar "by-reference".

I ditt exempel så lägger du till en referens till samma dataFields objekt två gånger i vektor. Om du deklarerat din vektor i C++ som vector<MyClass> så kommer push_back() att stoppa in en kopia (by-value), inte en referens i vektor, vilket är orsaken till att du sedan kan ändra dataFields utan att det påverkar det som ligger i vektorn.

Ett enkelt sätt att få samma sak i Java vore att implementera metoden clone() där du skulle göra något likt detta

@Override public MyClass clone() { MyClass c = new MyClass(); c.alias = alias; c.fullName = fullName; c.lastIP = lastIP; return c; }

och ditt program skulle då se ut så här

Vector<MyClass> friends = new Vector<MyClass>(); MyClass dataFields = new MyClass(); dataFields.alias = "ALIAS1"; dataFields.fullName = "namn1"; dataFields.lastIP = "1.1.1.1.1"; friends.add(dataFields.clone()); // <--- addera en klon dataFields.alias = "ALIAS2"; dataFields.fullName = "NAMN2"; dataFields.lastIP = "2.2.2.2.2"; friends.add(dataFields.clone()); // <--- addera en klon System.out.println("\n\t\t------->Size: "+friends.size()+"<------\n"); //2 System.out.println(friends.get(0).alias ); System.out.println(friends.get(1).alias );

Fast det är nog inte hur en Java-programmerare skulle lösa problemet, varför inte göra MyClass() immutable och sätta alla parameters i konstruktorn? Sedan skapar du en ny klass för varje data-nod du vill hålla reda på. Då instanser inte kan ändras behöver man inte klona.

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Medlem
Registrerad
Jul 2005
Citat:

@Yoshman:
Fast det är nog inte hur en Java-programmerare skulle lösa problemet, varför inte göra MyClass() immutable och sätta alla parameters i konstruktorn? Sedan skapar du en ny klass för varje data-nod du vill hålla reda på. Då instanser inte kan ändras behöver man inte klona.

Jag löste det genom:
myVector.add(new MyClass("name1", "fullName1", "last1", "image1"));
myVector.add(new MyClass("name2", "fullName2", "last2", "image2"));
myVector.add(new MyClass("name3", "fullName3", "last2", "image3"));

Men det kanske är som du säger - att en Javaprogrammerare kanske inte skulle lösa det på detta sätt.
Vi har inte gått igenom immutable, har du lust att dra det en snabbis hur det skulle fungera för mitt ändamål? och gärna så simpelt som möjligt

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

@Lexdale: vad du gjort nu är nog väldigt mycket hur de flesta skulle lösa problemet.

Instanser som är "immutable" är sådana där alla klassens medlemsvariabler bara kan sättas en gång, i princip alltid i konstruktorn. I Java skulle du då final deklarera alla dina medlemsvariabler. Har man sådana klasser finns ingen direkt anledning att ha set/get metoder, "set" är ändå inte tillåtet och "get" har inget större syfte (finns ju undantag där det som returneras av en "get" är mer än "return medlemsvariabelnamn;").

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2004
Skrivet av Lexdale:

Jag löste det genom:
myVector.add(new MyClass("name1", "fullName1", "last1", "image1"));
myVector.add(new MyClass("name2", "fullName2", "last2", "image2"));
myVector.add(new MyClass("name3", "fullName3", "last2", "image3"));

Men det kanske är som du säger - att en Javaprogrammerare kanske inte skulle lösa det på detta sätt.
Vi har inte gått igenom immutable, har du lust att dra det en snabbis hur det skulle fungera för mitt ändamål? och gärna så simpelt som möjligt

Exakt så jag hade gjort.

"Happiness is only real when shared"