Array-Elemente

Status
Nicht offen für weitere Antworten.

Iron Monkey

Bekanntes Mitglied
Hi an alle!

Aus 3 verschiedenen Elementen im Array gibt es 7 verschiedene Wörter!

Als Beispiel:

array[0] = "A"
array[1] = "B"
array[2] = "C"

In der Ausgabe soll es so sein:

"A"
"B"
"C"
"AB"
"AC"
"BC"
"ABC"

Wie kann ich das am besten per Schleife ausgeben?

ACHTUNG: Die Funktion soll auch andere Möglichkeiten geben können, z.B. für 5 verschiedene Array-Elemente sowie:

array[0] = "A"
array[1] = "B"
array[2] = "C"
array[3] = "D"
array[4] = "E"

Je mehr Array-Elemente kommen, desto mehr verschiedene Wörter gibt es!

Gruß
Iron Monkey
 

Iron Monkey

Bekanntes Mitglied
Hi SlaterB!

Super, besten Dank!

Ich wusste gar nicht, dass dieses Algorithmus "Kombinatorik" heisst! Das ist genau das, was ich brauche! :)

Gruß
Iron Monkey
 
S

SlaterB

Gast
weder geht es um einen speziellen Algorithmus (in dem Thread), noch ist Kombinatorik ein Algorithmus-Name,
sondern eher ein Teilbereich der Mathematik, so wie Analysis, falls dir das was sagt
 

Iron Monkey

Bekanntes Mitglied
Ja, da hast du völlig recht! Habe den Name "Kombinatorik" in Wikipedia ( hier ) nachgeschlagen!

Habe schon eine Klasse entwickelt, falls Dich das auch interessiert! ;)

HTML:
import java.util.*;

//die permutaions funktionen Klasse
public class Permutator
{
	/*
	 * hier wird das ganze array p von start bis n-1 um eine stelle nach links
	 * verschoben. dabei wird erstmal das startelement ge- speichert, und dann
	 * wieder ganz hinten in das array eingefügt!
	 */
	private static void push(int i_startIdx, Object[] io_objects) {
		Object temp = io_objects[i_startIdx - 1];
		for (int i = i_startIdx - 1; i < io_objects.length - 1; i++) {
			io_objects[i] = io_objects[i + 1];
		}
		io_objects[io_objects.length - 1] = temp;
	}

	/**
	 * This method creates a flat copy of the array
	 * 
	 * @param i_objs
	 * @return
	 */
	private static Object[] copy(Object[] i_objs) {
		Object[] objs = new Object[i_objs.length];
		System.arraycopy(i_objs, 0, objs, 0, objs.length);
		return objs;
	}

	/*
	 * dies ist die eigentliche permutations-fnkt Alle elemente werden genau so
	 * oft verschoben bis alle kombinationen abgearbeitet wurden! vom aktuellen
	 * element weg werden dann alle nachfolgenden Elemente weiterpermutiert. am
	 * schluss sieht die zahl dann wieder genau gleich aus, und muss daher nicht
	 * mehr ange- zeigt werden!
	 */
	private static void permu(int i_index, Object[] io_objects, ArrayList o_set) {
		for (int i = i_index; i <= io_objects.length; i++) {
			permu(i_index + 1, io_objects, o_set);
			push(i_index, io_objects);
			if (i != io_objects.length) {
				o_set.add(copy(io_objects));
			}
		}
	}

	private static ArrayList permutate(Object[] i_objects) {
		ArrayList set = new ArrayList();
		set.add(copy(i_objects));
		permu(1, copy(i_objects), set);
		return set;
	}

	public static Object[] permutate(Object i_object, ArrayConverter i_arrayConverter)
	{
		Object[] array = i_arrayConverter.toArray(i_object);
		ArrayList set = permutate(array);
		Object[] objs = new Object[set.size()];
		for (int i = 0; i < objs.length; ++i) {
			Object[] a = (Object[]) set.get(i);
			objs[i] = i_arrayConverter.toObject(a);
		}
		return objs;
	}
	
	public static void main(String[] args)
	{
		int[] val = new int[] { 1, 2, 3 };
		Object[] obj = Permutator.permutate( val, ArrayConverterHelper.createIntegerArrayConverter() );
	}
}

// hier das interface für die arrays
interface ArrayConverter
{
	/**
	 * This method transforms an array of objects into an object.
	 * 
	 * @param i_objects
	 *            An array of objects.
	 * @return An object.
	 */
	public Object toObject(Object[] i_objects);

	/**
	 * This method transforms an object into an array of objects.
	 * 
	 * @param i_object
	 *            The object to transform.
	 * @return An array of objects.
	 */
	public Object[] toArray(Object i_object);
}

// hier die implementierung für die Integer array Objekte
class ArrayConverterHelper
{
	public static ArrayConverter createIntegerArrayConverter()
	{
		return new ArrayConverter()
		{
			/*
			 * (non-Javadoc)
			 * 
			 * @see stuff.ArrayConverter#toObject(java.lang.Object[])
			 */
			public Object toObject(Object[] i_objects) {
				int[] val = new int[i_objects.length];
				for (int i = 0; i < val.length; ++i) {
					val[i] = ((Integer) i_objects[i]).intValue();
				}
				return val;
			}

			/*
			 * (non-Javadoc)
			 * 
			 * @see stuff.ArrayConverter#toArray(java.lang.Object)
			 */
			public Object[] toArray(Object i_object) {
				int[] v = (int[]) i_object;
				Integer[] val = new Integer[v.length];
				for (int i = 0; i < val.length; ++i) {
					val[i] = new Integer(v[i]);
				}
				return val;
			}
		};
	}
}

Gruß
Iron Monkey
 

SchonWiederFred

Bekanntes Mitglied
Wie kann ich das am besten per Schleife ausgeben?
Es ist deutlich flexibler, zu diesem Zweck eine Klasse Permutation zu schreiben, die Iterable<String> implementiert.

Dann müssen die ganzen Kombinationen nicht erst in einer Collection gespeichert werden (wodurch der Arbeitsspeicher schnell zur Neige gehen kann), sondern können sozusagen on-the-fly verarbeitet werden.

Trotzdem hat man noch die Flexibilität mit den erzeugten Strings zu tun, was man möchte (auf der Konsole ausgeben, in eine Collection packen, Filtern etc.)

So würde ich es machen:
Code:
import java.util.Iterator;

public class Permutation implements Iterable<String>
{
	private final String wort;

	public Permutation(String wort)
	{
		if (wort == null) throw new NullPointerException();
		if (wort.length() >= 32) throw new IllegalArgumentException();
		this.wort = wort;
	}

	public Iterator<String> iterator()
	{
		return new Iterator<String>()
		{
			private final int laenge = wort.length();
			private final StringBuilder builder = new StringBuilder(laenge);
			private int nummer = 1;
			private final int anzahl = 1 << laenge;

			public boolean hasNext()
			{
				return nummer < anzahl;
			}

			public String next()
			{
				if (!hasNext()) throw new IllegalStateException();
				for (int i = 0; i < laenge; ++i)
				{
					if (((nummer >>> i) & 1) != 0)
					{
						builder.append(wort.charAt(i));
					}
				}
				String result = builder.toString();
				builder.setLength(0);
				++nummer;
				return result;
			}

			public void remove()
			{
				throw new UnsupportedOperationException();
			}
		};
	}
}

public class Main
{
	public static void main(String[] args)
	{
		for (String p : new Permutation("ABCDE"))
		{
			System.out.println(p);
		}
	}
}
 

SchonWiederFred

Bekanntes Mitglied
Und wer einen Blick über den Java-Tellerrand wagt, findet deutlich kompaktere Lösungen:
Code:
permute = foldr step [[]]
    where step x rest = map (x:) rest ++ rest
 

Iron Monkey

Bekanntes Mitglied
Hi SchonWiederFred!

Respekt! Es ist wirklich noch flexibler und ich habe deinen Code ein wenig geändert, so dass man nicht nur die Buchstaben vertauscht, sondern auch die Wörter! Siehe unten:

Vielen Dank für den Supertipp :)

HTML:
import java.util.*;

public class Permutation implements Iterable<String>
{
	private final String[] wort;

	public Permutation(String[] wort)
	{
		if (wort == null)
			throw new NullPointerException();

		if (wort.length >= 32)
			throw new IllegalArgumentException();

		this.wort = wort;
	}

	public Iterator<String> iterator()
	{
		return new Iterator<String>()
		{
			private final int laenge = wort.length;
			private final StringBuilder builder = new StringBuilder(laenge);
			private int nummer = 1;
			private final int anzahl = 1 << laenge;

			public boolean hasNext()
			{
				return nummer < anzahl;
			}

			public String next()
			{
				if (!hasNext())
					throw new IllegalStateException();
				
				for (int i = 0; i < laenge; ++i)
					if (((nummer >>> i) & 1) != 0)
						builder.append(wort[i] + " ");

				String result = builder.toString().trim();
				builder.setLength(0);
				++nummer;

				return result;
			}

			public void remove()
			{
				throw new UnsupportedOperationException();
			}
		};
	}

	public static void main(String[] args)
	{
//		String[] wort = { "A", "B", "C", "D", "E" };
		String[] wort = { "Max", "Mustermann", "programmiert", "mit", "Java" };
		Permutation p = new Permutation( wort );
		Iterator<String> it = p.iterator();

		int row = 0;
		while( it.hasNext() )
		{
			System.out.println( "[ " + (row+1) + " ] = " + (String) it.next() );
			row++;
		}
		System.out.println( "" );
		System.out.println( wort.length + " Wörter = " + ( (int) Math.pow( 2, wort.length ) - 1 ) + " verschiedene Möglichkeiten!" );
	}
}

Gruß
Iron Monkey
 

SchonWiederFred

Bekanntes Mitglied
Streng genommen handelt es sich hierbei übrigens nicht um Permutationen, sondern um die Elemente der Potenzmenge :)

Wenn Du Buchstaben und Wörter verarbeiten willst, kann man ja auch gleich beliebige Objekte verarbeiten:
Code:
import java.util.Iterator;

public class Potenzmenge implements Iterable<String>
{
	private final Object[] menge;
	private final String trenner;
	
	public Potenzmenge(Object... menge)
	{
		if (menge == null) throw new NullPointerException();
		if (menge.length >= 32) throw new IllegalArgumentException();

		this.menge = menge.clone();
		trenner = " ";
	}
	
	public Potenzmenge(String wort)
	{
		if (wort == null) throw new NullPointerException();
		int laenge = wort.length();
		if (laenge >= 32) throw new IllegalArgumentException();

		menge = new Object[laenge];
		for (int i = 0; i < laenge; ++i)
			menge[i] = wort.charAt(i);
		trenner = "";
	}

	public Iterator<String> iterator()
	{
		return new Iterator<String>()
		{
			private final int laenge = menge.length;
			private final StringBuilder builder = new StringBuilder();
			private int nummer = 1;
			private final int anzahl = 1 << laenge;
			
			public boolean hasNext()
			{
				return nummer < anzahl;
			}

			public String next()
			{
				if (!hasNext()) throw new IllegalStateException();
				String trenner = "";
				for (int i = 0; i < laenge; ++i)
				{
					if (((nummer >>> i) & 1) != 0)
					{
						builder.append(trenner);
						builder.append(menge[i]);
						trenner = Potenzmenge.this.trenner;
					}
				}
				String result = builder.toString();
				builder.setLength(0);
				++nummer;
				return result;
			}

			public void remove()
			{
				throw new UnsupportedOperationException();
			}
		};
	}
	
	public static void main(String[] args)
	{
		for (String p : new Potenzmenge("ABCDE"))
		{
			System.out.println(p);
		}
		for (String p : new Potenzmenge("Max", "Mustermann", "programmiert", "mit", "Java"))
		{
			System.out.println(p);
		}
	}
}
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
S Array: Anzahl Elemente mit best. Wert zählen Allgemeine Java-Themen 4
M Progblem bei Zugriff auf Array Elemente Allgemeine Java-Themen 4
G Umkehrung der Array Elemente Allgemeine Java-Themen 2
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
M Array Rang eines Elements Allgemeine Java-Themen 4
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
noah1407 Array Allgemeine Java-Themen 3
D Methoden Teil-Array mit Maximalwert bestimmen Allgemeine Java-Themen 23
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
N zweidimensionalen Array in dreidimensionalen Array speichern Allgemeine Java-Themen 4
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
L Array und Index Allgemeine Java-Themen 26
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
Willi.We Array sortieren Allgemeine Java-Themen 5
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
H Array Sportschütze Allgemeine Java-Themen 6
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
M Array verändern Allgemeine Java-Themen 1
A JavaFX 2 dimensionales array Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
parrot Array Aufgabe Allgemeine Java-Themen 3
N String Array Eingabe Allgemeine Java-Themen 6
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
A Array Problem Allgemeine Java-Themen 8
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
F Datei in String-Array einlesen Allgemeine Java-Themen 8
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
F 3 Dimensionales Array mit Allgemeine Java-Themen 9
M Steueralgorithmus verwandelt Array in Anfangszustand Allgemeine Java-Themen 9
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
T Objekt in Array packen Allgemeine Java-Themen 6
M Zahlen in Array anordnen Allgemeine Java-Themen 8
M Eclipse Unvollständigen Array ansteuern Allgemeine Java-Themen 2
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Variablen Array ertellen bei model.put Allgemeine Java-Themen 13
S Eindimensionales Array in zweidimensionales Array speichern Allgemeine Java-Themen 5
R convert 2d array list to 2d array Allgemeine Java-Themen 1
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
L Datentypen 3D Array Allgemeine Java-Themen 3
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
E Swing Array mit Bildern in GUI darstellen Allgemeine Java-Themen 2
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
M Zweidimensionales Array mit Binärzahlen füllen Allgemeine Java-Themen 8
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
G Array ohne Aufzählungszeichen ausgeben Allgemeine Java-Themen 6
J Wie kann ich ein Java Array als Säulendiagramm ausgeben? Allgemeine Java-Themen 2
Z 2D Array Pixels reparieren Allgemeine Java-Themen 2
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
B Polibios Array erweitern Allgemeine Java-Themen 1
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
J Array-List Bubble-Sort Allgemeine Java-Themen 12
4 Variablen Int-Array Int Zuweisen Allgemeine Java-Themen 7
J Array Allgemeine Java-Themen 8
Z Array mit unterschiedlichen Werten Allgemeine Java-Themen 1
L sortiertes Array im main aufrufen klappt nicht. Allgemeine Java-Themen 3
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
A Mit dem letzten bis zum ersten Wert aus Array rechnen Allgemeine Java-Themen 15
A Vector Strings in Array splitten Allgemeine Java-Themen 6
I Muster in Array suchen Allgemeine Java-Themen 10
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben