PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arrays in Java



hacker
21.07.2006, 17:57
Guten Abend liebe Java-Programmierer O:)

Ich werfe euch mal einfach 2 Fragen an den Kopf, wo ich absolut keine Ahnung habe, wie das auch nur näherungsweise funktionieren könnte:

1. Wie kann ich ein schon vorher definiertes Array erweitern ohne das die darin enthaltenen Daten verloren gehn?
2. Gibt es Befehle um die Daten in nem Array miteinander zu tauschen oder nach links/rechts shiften usw. ohne Datenverlust und Zwischenspeicherung in ner Hilfsvariable o.ä.?

Wäre euch sehr verbunden, wenn ihr mir da ein wenig auf die Sprünge helfen könntet :)

Über ein Suchwort wäre ich auch erfreut. Nur über "Array" findet man in Google zu viel; präzise Beschreibung zum Suchen ist mir nicht eingefallen.

Gruss Hacker

uwegw
21.07.2006, 18:03
Zu Fuß wär das alles gut mit Zeigern zu erledigen... nur sind die in Java ja weggesperrt, weil man damit halt sehr viel Mist bauen kann wenn man nicht aufpasst...

Mit Java hab ich zuletzt in der Schule gearbeitet. Ich weiß aber nicht, ob wir da mal nen Array benutzt haben. Wir haben lieber mit Java auf SQL-Server zugegriffen...

linux_80
21.07.2006, 18:15
Hallo,

muss es umbedingt ein Array sein ?
Es gibt ja schönere sachen, angefangen beim Vector, Hashtable, Map und Set, oder LinkedList, damit kann man sich auch was eingenes zusammenbauen.
Fällt alles unter das Thema Collections.

Ich hab mir damals dieses Buch gekauft, kann man auch runterladen.
http://www.javabuch.de/

hacker
21.07.2006, 18:19
Jop, es sollte unbedingt ein Array sein..:/

SprinterSB
21.07.2006, 19:22
und sowas wie arraylist aus java.util? Du brauchst ja nicht nur funktionalität eines Arrays sondern auch die einer Liste. Eigentlich willst du ne Liste haben.

Wenn es wirklich n Array sein muss kannst nen STringBuffer nehmen und das Zeug darin abbilden, aber wenn du den grösser machst wird auch kopiert.

ogni42
22.07.2006, 13:47
1. Geht mit Vector<> (Java 5)
2. Geht m.W. nur zu Fuß

hacker
22.07.2006, 13:59
Nach nochmaligem Googlen bin ich auch auf die Vector Classe gestoßen und werde die nun auch verwenden. Gibts da evt. schon automatische Sortierungsbefehle oder müsste ich eine Liste von Hand sortieren?

hacker
22.07.2006, 14:19
Entschuldigung für den Doppelpost, habs aber gefunden:

Collections.sort(Vector);


Gruss Hacker

ogni42
22.07.2006, 15:26
Im Java5 SDK gibt's doch Doku. Kannst Du bei SUN runterladen. Da ist alles beschrieben.

linux_80
22.07.2006, 16:38
... bin ich auch auf die Vector Classe gestoßen ...

hab ich ja schon erwähnt,
performancemässig ist der Vector aber nicht so optimal, wenn sich nachträglich die grösse ändert,
denn hinter einem Vector liegt auch ein Array.
Das braucht viel Speicher, wenn nach jedem neuen Element die komplette Liste intern rumkopiert werden muss.
Man sollte schon einigermassen wissen wie viele Elemente es werden können, man kann ja die aktuelle grösse abfragen wenns weniger als vorgesehen sein sollten.
Evtl. den capacityIncrement etwas grösser machen, dann wirds nicht ganz so schlimm mit der kopiererei.

SprinterSB
22.07.2006, 19:15
Du kannst auch eine der Tree klassen nehmen. Du stopfst das Zeug da rein und nimmst es sortiert wieder raus. Den COmparator (der zwei Elemente vergleicht und die Ordnung definiert) must du in Tree.Construktor mitliefern. Ist glaub die TreeList oder so... schau halt mal was die java.util so bietet.

hacker
23.07.2006, 13:18
Die TreeList sieht auch nicht schlecht aus. Werds mir mal genauer angucken. Danke für eure Tipps!

Baba84
27.09.2006, 18:25
Hi,
also ich habe nur eben den Post kurz überflogen. Zur ersten Frage ob man ein Array einfach so erweitern kann, kann ich dir sagen das geht nicht. Außer am definiert sich ein größeres Array und schiebt die Daten dort rein. Aber das kann ja nicht im sinne von einem sauberen Progarmier stiel sein. Dafür gibt es in Java die so genannten ArrayListen(java.util.ArrayList). Bei dennen musst du dir keine Gedanken um die Größe machen sie erweitern fortlaufenend, wenn du an die Grenze stößt.

Sortieren ohne eine Hilfsvari geht, aber das kann ich jetzt nicht mehr aus dem stehgreif beantworteten. Aber was spricht dagegen einen Hilfsvari zu benutzten, das ist eingetlich sogar gängige Praxis. ;)

Ich hoffe ich konnte dir weitere helfen.

OMarohn
28.09.2006, 09:25
Hier ein einfaches Beispiel wie es gehen kann, und es ist schnell.
Dennoch kann man festhalten das die in Util verwendetetn Implementationen von ArrayList etc. sicher genausogut verwendet werden können.

@uwegw Na ja die Frage ist was für Zeiger brauchst Du? Zeiger auf dedizierte Speicherbereiche bekommst Du in Java nicht, aber Zeiger auf andere Objekte und damit kannst Du ja einfach verkettete Listen etc. bauen ;-)



package com.demo.arraycopy;

import java.util.Arrays;
import java.util.Random;


/**
* Demo für die Verwendung von System.ArrayCopy und Array.sort();
* @author marohn
* @since 2.09p
*/
public class ArrayCopyDemo
{
//Original Array
private Integer[] arrayOfInt = new Integer[10];

/**
* Konstruktor, Vorbelegung des Arrays mit Integer 1..10
*/
public ArrayCopyDemo()
{
for (int i = 0; i<10; i++)
{
arrayOfInt[i] = new Integer(i+1);
}
}

/**
* Schreibt die Werte des Arrays in die Console
*/
public void dumpArray()
{
for (int i = 0; i < arrayOfInt.length; i++)
{
System.out.println(arrayOfInt[i].toString());
}
}

/**
* Schreibt zufällige Werte in das Array
* @param startIdx Index ab dem das Array mit den Werten gefüllt werden soll
*/
public void fillArrayWithRandomStuff(int startIdx)
{
Random rnd = new Random(System.currentTimeMillis());
for (int i = startIdx; i < arrayOfInt.length; i++)
{
arrayOfInt[i] = new Integer(rnd.nextInt());
}
}

/**
* Sortiert das Array mit Hilfe der Arrays.sort -Methode
* Funktioniert hier so easy weil Integer bereits das Comparator-Interface implementiert
* bei eigenen Klassen muss sichergestellt werden, das dieses Inerface implementiert wurde
*/
public void sortArray()
{
Arrays.sort(arrayOfInt);
}

private void incArray(int anz)
{
Integer[] newArr = null;
if (anz>0 && arrayOfInt != null)
{
newArr = new Integer[arrayOfInt.length + anz];
System.arraycopy(arrayOfInt, 0, newArr, 0, arrayOfInt.length);
}
else
{
throw new IllegalStateException("Parameter nicht im definierten Bereich");
}
arrayOfInt = newArr;
}

/**
* Start
* @param args - keine
*/
public static void main(String[] args)
{
ArrayCopyDemo demo = new ArrayCopyDemo();
demo.dumpArray();
System.out.println("---------------------");
demo.incArray(10);
demo.fillArrayWithRandomStuff(10);
demo.dumpArray();
System.out.println("---------------------");
demo.sortArray();
demo.dumpArray();
System.out.println("---------------------");
}
}