Vectorelemente in einen anderen Vector kopieren

prototype0815

Aktives Mitglied
Hey folks,

ich bin mal wieder auf ein ungewöhnliches Problem gestoßen. Ziel ist es, Elemente eines Vectors zu vervielfältigen.

Meine Gedankengänge waren folgende...

Ich habe einen Vector "vA" der beinhaltet ebenfalls wieder Vectoren. Sagen wir mal er fasst 3 Vectoren.Also fasst vA -> Vector "vA1", "vA2", "vA3"
Ich möchte nun diese 3 Vectoren mit einem variablen Faktor vervielfältigen. Sasgen wir *4.

Zum Ende hat mein äußerer Vector vA folgende Vectoren gefasst...
"vA1", "vA1", "vA1", "vA1", "vA2", "vA2", "vA2", "vA2", "vA3","vA3","vA3","vA3"
jeden Vector statt 1 mal also nun 4 mal... Eigentlich ganz simpel, nur kommt jetzt der Haken...

Hole ich mir den ersten Vector "vA1" und verändere irgendeinen Wert dieses Vectors, werden vom zweiten, dritten und vierten "vA1" die Werte ebenfalls geändert!
Und genau hierbei liegt mein Problem.

Zur Verdeutlichung hier mein Code mit dem ich den Inhalt vervielfältige.
Code:
            Vector temp = new Vector(dataVector.size(), 1);

            for (int m = 0; m < dataVector.size(); m++)
              temp.addElement(dataVector.elementAt(m)); // übertragen der Elemente in den Temp Vector, weil die Ausgangsvariable "dataVector" sein muss
            
            dataVector.removeAllElements();
           
            for (int j = 0; j < temp.size(); j++) {
              for (int k = 0; k < ctrVarPcs.getValue(); k++) { // k < größe des Faktors
                dataVector.addElement(temp.elementAt(j));
              }                
            }

Wie kann ich also die Elemente in einem Vector vervielfältigen ohne das es letztendlich nur "ein Objekt an 4 Stellen des Speichers dargestellt" ist.
 

Flown

Administrator
Mitarbeiter
Ist doch ganz einfach:

Java:
import java.util.Arrays;
import java.util.Vector;

public class Test {
  public static void main(String... args) {
    Vector<String> vA = new Vector<String>();
    vA.addAll(Arrays.asList("vA1", "vA2", "vA3"));
    
    System.out.println(multiplyElements(vA, 4));
    multiplyElementsInPlace(vA, 3);
    System.out.println(vA);
  }
  
  public static <T> Vector<T> multiplyElements(Vector<T> vector, int times) {
    Vector<T> result = new Vector<T>();
    for (T elem : vector) {
      for (int i = 0; i < times; i++) {
        result.add(elem);
      }
    }
    return result;
  }
  
  public static <T> void multiplyElementsInPlace(Vector<T> vector, int times) {
    for (int i = vector.size() - 1; i >= 0; i--) {
      for (int j = 0; j < times; j++) {
        vector.add(i, vector.get(i));
      }
    }
  }
}
 

prototype0815

Aktives Mitglied
deine Funktionen machen was sie sollen, sie vervielfältigen die Vectoren in meinem äußeren Vector. Allerdings tritt das selbe Problem auf wie bei meiner Variante.
 

Flown

Administrator
Mitarbeiter
Aus deinem Beispiel oben wie soll, nach der Änderung, sagen wir an der 1. Stelle, dein Vector aussehen?
 

Flown

Administrator
Mitarbeiter
Ahja jetzt versteh ich dich richtig, dann benötigst du sowas wie ein clone(shallow copy) oder ein deep-Copy. Hier mal ne Anregung:

Java:
import java.util.Arrays;
import java.util.Vector;

public class Test {
  public static void main(String... args) {
    Vector<MyClass> vARef = new Vector<>();
    vARef.addAll(Arrays.asList(new MyClass(1), new MyClass(2), new MyClass(3)));
    
    System.out.println(multiplyElementsReferences(vARef, 4));
    multiplyElementsInPlaceReferences(vARef, 3);
    System.out.println(vARef);
    vARef.get(0).setNumber(5);
    System.out.println(vARef);
    
    Vector<MyClass> vA = new Vector<>();
    vA.addAll(Arrays.asList(new MyClass(1), new MyClass(2), new MyClass(3)));
    
    System.out.println(multiplyElements(vA, 4));
    multiplyElementsInPlace(vA, 3);
    System.out.println(vA);
    vA.get(0).setNumber(5);
    System.out.println(vA);
  }
  
  public static <T extends Copyable<T>> Vector<T> multiplyElements(Vector<T> vector, int times) {
    Vector<T> result = new Vector<T>();
    for (T elem : vector) {
      for (int i = 0; i < times; i++) {
        result.add(elem.copy());
      }
    }
    return result;
  }
  
  public static <T extends Copyable<T>> void multiplyElementsInPlace(Vector<T> vector, int times) {
    for (int i = vector.size() - 1; i >= 0; i--) {
      for (int j = 0; j < times; j++) {
        vector.add(i, vector.get(i).copy());
      }
    }
  }
  
  public static <T> Vector<T> multiplyElementsReferences(Vector<T> vector, int times) {
    Vector<T> result = new Vector<T>();
    for (T elem : vector) {
      for (int i = 0; i < times; i++) {
        result.add(elem);
      }
    }
    return result;
  }
  
  public static <T> void multiplyElementsInPlaceReferences(Vector<T> vector, int times) {
    for (int i = vector.size() - 1; i >= 0; i--) {
      for (int j = 0; j < times; j++) {
        vector.add(i, vector.get(i));
      }
    }
  }
  
  static class MyClass implements Copyable<MyClass> {
    
    private int number;
    
    public MyClass(int number) {
      this.number = number;
    }
    
    public int getNumber() {
      return number;
    }
    
    public void setNumber(int number) {
      this.number = number;
    }
    
    @Override
    public MyClass copy() {
      return new MyClass(getNumber());
    }
    
    @Override
    public String toString() {
      return String.valueOf(getNumber());
    }
  }
  
  interface Copyable<T> {
    T copy();
  }
}
 

prototype0815

Aktives Mitglied
vA sieht nach der Änderung genau so aus wie ich es oben dargestellt hab, bzw. wie deine Funktionen es machen.

vA1 z.B. ist ebenfalls ein Vector der in meinem Beispiel 10 Objekte enthällt. (Long, Long, Double, Long, String,....)

das Problem an der ganzen Sache, soweit ich das verstanden hab, ist dass sogenannte flache Kopien der enthaltenen Vectoren gemacht werden. Sprich der Vector "vA1" existiert im Speicher genau 1 mal, wird aber durch diese ganzen kopieraktionen mehrmals in meinem Vector "vA" dargestellt (an Stelle 0-3). Es wird in "vA" wahrscheinlich nur ein Verweis auf "vA1" angelegt.
 

Flown

Administrator
Mitarbeiter
Habs gesehen, du hast aber auch String als Beispiel genommen. Die sind von Haus aus immutable. Darum funktionierst mit Strings und primitiven Datentypen.

Ich hab dir oben eine Möglichkeit geboten, wie du das mit dem Kopieren hinbekommst!
 

prototype0815

Aktives Mitglied
hm, ok. Ich hab es oben nicht ganz korrekt angegeben. Es sind nicht direkt die primitiven Datentypen in den Vectoren gespeichert. Es sind selbst geschriebene Klassenobjekte. DoubleElement, LongElement, StringElement... diese speichern die Daten natürlich mit primitiven Datentypen aber des weiteren speichern sie noch viel mehr Information die ich an so ein Element anhängen kann.
 

prototype0815

Aktives Mitglied
hab ne Lösung zusammengefriemelt...

Code:
            for (int m = 0; m < dataVector.size(); m++)         // alle Vectoren in einem Temp Vector speichern
              temp.addElement(dataVector.elementAt(m));
            dataVector.removeAllElements();
           
            for (int j = 0; j < temp.size(); j++) {
              Vector v = new Vector(5, 2);
              for (int k = 0; k < ((Vector)temp.elementAt(j)).size(); k++) {   // jeden inneren Vector vom Vector Temp holen
                v.addElement(((Vector)temp.elementAt(j)).elementAt(k));         // und jedes Double-, Long-, StringElement in einem neuen Vector abbilden.
              }
              for (int l = 0; l < ctrVarPcs.getValue(); l++) {  // größe des Faktors
                Vector v2 = new Vector(5, 2);                   // es muss jedes mal ein neuer Vector erstellt werden
                for (int n = 0; n < v.size(); n++) {
                  if(v.elementAt(n) instanceof LongElement) {
                    LongElement le = (LongElement)(((LongElement)v.elementAt(n)).clone());
                    v2.addElement(le);
                  }
                  else if(v.elementAt(n) instanceof DoubleElement) {
                    DoubleElement le = (DoubleElement)(((DoubleElement)v.elementAt(n)).clone());
                    v2.addElement(le);
                  }
                  else if(v.elementAt(n) instanceof StringElement) {
                    StringElement le = (StringElement)(((StringElement)v.elementAt(n)).clone());
                    v2.addElement(le);
                  }
                }
                dataVector.addElement(v2);
              }                
            }

nach diesem umständlichen hin und her kopiere, ist mein Problem verschwunden. Ich vermute weil ich jedes mal einen neuen Vector (v2) erstellt habe, und dort die einzelnen Elemente hinein geclont hab.
 

prototype0815

Aktives Mitglied
Zum ersten bin ich noch nicht so fit in Sachen Generics, zweitens kenne ich noch keine wirklichen Vorteile, ich sehe eher die Nachteile darin. Zudem entwickeln wir in der Firma auf Basis Java 1.4, da unser Applet auf einer Linux Kiste läuft deren Kernel wir zum Teil selbst geschrieben haben, und diese Linux Version kein höheres Java unterstützt.

Deshalb lässt mich der Compiler auch schön in Ruhe wenn ich es nicht verwende ;)

Was würde es mir denn, so grob gesagt, für Vorteile bringen wenn ich Generics verwende?
Ich hab mit dem Vector doch so ein tolles Konstrukt in das ich alles hinein schmeissen kann, warum muss ich mir diese Box dann auf einen Elementaren Datentyp verschmälern?
 

Flown

Administrator
Mitarbeiter
Dann hat sich das erledigt, wenn ihr auf 1.4 programmiert.

Vorteile sind weniger typecasts instanceof und weitere Errungenschaften für "Typsicherheit".
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
Robert Zenz Ich brauche bitte mal kurz einen Sanity/Reality-Check betreffend Tests. Allgemeine Java-Themen 9
R Wie gestaltet man einen Authentifizierungsflow? Allgemeine Java-Themen 6
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
N Wie mache ich einen UnitTest? Allgemeine Java-Themen 16
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
Jose05 Gibt es einen Nachteil bei dem JDK 8? Allgemeine Java-Themen 7
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
ZH1896ZH Best Practice Wie erstellt man am besten einen Kalender? Allgemeine Java-Themen 3
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
Zrebna FileUtils.cleanDirectory() - aber einen sub-Ordner "verschonen" Allgemeine Java-Themen 1
MiMa Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
L Generator für einen Parser implementieren Allgemeine Java-Themen 13
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
MoxxiManagarm Ich brauche einen smarten Ansatz Allgemeine Java-Themen 23
J Gebautes Jar per Maven in einen Docker Container kopieren Allgemeine Java-Themen 0
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
E Einen Bot Programmieren. Allgemeine Java-Themen 6
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
P [Webdriver] einen Datensatz signieren Allgemeine Java-Themen 0
R MAC-Adresse eindeutig für einen PC ? Bezug zu Netzwerk, wieso ? Allgemeine Java-Themen 7
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Wie einen ClientBuilder / JarBuilder programmieren? Allgemeine Java-Themen 14
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
L Wie programmiert man einen Listener? Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
Thallius Wie convertiere ich einen pkcs8 key in einen java lesbaren? Allgemeine Java-Themen 16
M Was braucht man, um einen Java Job zu bekommen? Allgemeine Java-Themen 8
G Substrings in einen String zusammenfassen Allgemeine Java-Themen 5
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
N Compiler-Fehler Warum erhalte ich einen Nullpointer Fehler? Allgemeine Java-Themen 2
P Zum src Ordner einen Projektes navigieren Allgemeine Java-Themen 8
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
MaxG. Swing Wie kann man einen Dateiordner auswählen ? Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
KeVoZ_ int Werte in einen String fassen Allgemeine Java-Themen 4
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
S Einen Punkt um den Ursprung drehen Allgemeine Java-Themen 5
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
M Genaues Bugtracking - jemand einen Vorschlag? Allgemeine Java-Themen 14
L Gibt es in Java einen Property Editor? Allgemeine Java-Themen 2
S Einen übergebenen String kopieren Allgemeine Java-Themen 3
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Wie kann ich einen Keystore aus existierenden Zertifikaten erstellen? Allgemeine Java-Themen 1
U in java an einen Rückgabewert aus matlab rankommen Allgemeine Java-Themen 2
B einen color-chooser bauen, ähnliche Farben vermeiden Allgemeine Java-Themen 5
B .txt Datei in einen kompletten String konvertieren Allgemeine Java-Themen 20
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
M String in einen 2D array bringen Allgemeine Java-Themen 2
Y Prüfen ob ein Graph immer einen von mehren Enden erreicht Allgemeine Java-Themen 4
J (Java3D) Einen Faden programmieren - Logikproblem Allgemeine Java-Themen 5
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
Rudolf In wie fern lohnt sich C++ für einen Javaentwickler Allgemeine Java-Themen 70
A Welches Speichermanagement für einen Kalkulator Allgemeine Java-Themen 7
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
J String-Typ in einen generischen Typ T umwandeln Allgemeine Java-Themen 6
S RandomAcessFile das einen InputStream wrappt..? Allgemeine Java-Themen 2
H Scanner soll einen Inputredirect einlesen, liest aber nicht jedes Wort ein. Allgemeine Java-Themen 3
H Wie erzeugt man einen Daemon? Allgemeine Java-Themen 7
S Wie beendet man einen Process in Java Platform unabhänging? Allgemeine Java-Themen 8
Z Threads Thread für einen Client Allgemeine Java-Themen 9
A nur einen Wert aus einer .conf lesen und erneuern Allgemeine Java-Themen 3
S MANIFEST DATEI hat nur einen Eintrag Allgemeine Java-Themen 14
M Einen Prozess "crashen" lassen Allgemeine Java-Themen 9
I getResponseCode(); returnt einen falschen Wert? Allgemeine Java-Themen 7
U Wie kann mit einen Java Applet Dateien erstellen,verschieben und löschen? Allgemeine Java-Themen 9
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
A Framework für einen Web Service Allgemeine Java-Themen 6
I %AppData% Variable für einen Prozess setzen Allgemeine Java-Themen 23
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
S regex für einen Link Allgemeine Java-Themen 3
M Client für einen Webservice erstellen (ONVIF) Allgemeine Java-Themen 3
T Undwandlung eines String in einen InputStream? Allgemeine Java-Themen 3
M Selbst geschriebener InputStreamReader über einen beliebigen InputStream Allgemeine Java-Themen 4
P Datei in einen String lesen Probleme bei Codierung Allgemeine Java-Themen 2
H SwingWorker statt Thread für einen Server Allgemeine Java-Themen 2
G einen Thread beim Schlafen überraschen und abschießen Allgemeine Java-Themen 3
A Variable Parameterinhalte an einen Query übergeben? Allgemeine Java-Themen 3
M einen Tag addieren Allgemeine Java-Themen 11
T In der JVM einen weiteren, unabhängigen Prozess starten Allgemeine Java-Themen 11
Schandro Datei öffnen mit... Bestimmten Dateityp mit einen Java-Programm öffnen lassen Allgemeine Java-Themen 5
B Gibt es einen Unterschied zwischen Java 1.2 und Java 2? Allgemeine Java-Themen 7
T Wie kann ich einen doppelstart vermeiden? Allgemeine Java-Themen 9
G Teilstring in einen String einfügen Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben