Auswahl von Arrays durch Stringeingabe

Nuada

Mitglied
Hallo,

ich möchte aus definierten int Arrays nur die nutzen, die ich über eine Stringeingabe auswähle. Mehrfachnennungen sollen auch möglich sein. Allerdings weiß ich nicht wie ich über die Stringeingabe eine Verknüpfung zu den Arrays herstellen kann. Bisher wird die Eingabe nur als eigener String gespeichert ohne jeden Bezug zu den Arrays. Wie kann ich durch die Stringeingabe die Arrays z.B. in einer Liste neu anordnen, damit es möglich ist, die Arrays automatisch zu sortieren (wobei nur der erste Wert im Array zum Sortieren genutzt werden soll)?


Zum besseren Verständnis meines Problems hier der Quellcode mit anschließender Zusammenfassung:


Java:
import java.util.Scanner;

public class Arrayaufruf {
	
	
		public static void main(String[] args) {
			
		//definierte Arrays	
		int cl1[] =  {10,2,2};
		int cl2[] =  {8,2,2};
		int cl3[] =  {10,1,1};
		int cl4[] =  {6,4,3};
		int cl5[] =  {4,4,2};
		int cl6[] =  {3,3,2};
//hier kommen noch beliebig viele weitere Arrays hin


		Scanner clscan= new Scanner(System.in);          //Eingabe von gewünschten Arrays
		System.out.print("cls eingeben: ");
		String Auswahl = clscan.nextLine();
		System.out.println("Eingegebene Cls: " + Auswahl);  //Kontrollausgabe

		//Speichern der Auswahl in neuem Array:
		String [] AuswahlArray = Auswahl.split(" ");             //PROBLEM: Kein Bezug zu den definierten Arrays!
		//Kontrollausgabe:		
		for (int i=0, length = AuswahlArray.length;i < length; i++)
			{System.out.println(AuswahlArray[i]);	}
//Welche Länge hat das neue Array:
		System.out.println("Sie haben " + AuswahlArray.length + " cls ausgewählt" );

ZUSAMMENFASSUNG:
-Eingabe von cl1 führt zu einem Speicherinhalt von "cl1" im Array
-Es soll aber das int Array cl1 inkl. dessen Inhalt geladen werden

-Anschließend sollen die ausgewählten Arrays der Reihe nach z.B. aus einer Liste abgearbeitet werden können
-Automatische Sortierung der Liste der größe nach, abhängig vom ersten Wert des jeweiligen Arrays
-Mehrfacheingabe des gleichen Arrays soll möglich sein




Vielen Dank für Eure Unterstützung 🙂

P.S.: Bin Java Anfänger, Erklärung möglichst für dumme ;-)
 
Zuletzt bearbeitet:
Wo genau besteht denn nun das Problem?
Auf ein int Array kann genauso zugegriffen werden wie auf das von dir erstellte String Array.
 
Ich würde dir zu einer If-Else-Abfrage oder zum Switch-Statement raten, sofern du Java7 verwendest, denn dann kannst du nach deiner Eingabe prüfen, ob es zu einem bestimmten Array passt und dieses dann durch die for-Schleife jagen lassen.
 
Alle Arrays in eine Liste packen und dann aus der Eingabe cl1 den Index 1 extrahieren, auf Index 1 oder 0 der Liste zugreifen etc.
 
Hm. Das Problem bei einer If-Else-Abfrage ist, dass das Programm zur Zeit nur eine sehr kleine Auswahl an Arrays hat. Später werden es aber sehr viel mehr. D.h.: ich müsste doch jedes Einzelne Array per If-Else-abfragen? Schon bei 100 Arrays wäre der Aufwand enorm.
 
Da würde ich dich doch erstmal fragen: Was hast du überhaupt vor? Du willst doch auch nicht eine Klasse mit 100erten von Arrays definieren, oder?

Was soll das Ganze denn werden wenn es fertig ist?

Ich glaube da gibt einen deutlich besseren Weg.
 
Zuletzt bearbeitet von einem Moderator:
Später sollen die Arrays durch eine Datenbank ersetzt werden. Aber zu Testzwecken sollte das Programm mit einer gewissen Auswahl an Arrays funktionieren.
 
Alle Arrays in eine Liste packen und dann aus der Eingabe cl1 den Index 1 extrahieren, auf Index 1 oder 0 der Liste zugreifen etc.

Ich bin soweit, dass ich für jede Eingabe eines cls einen Wert in die Liste eintragen kann. Aber wie kann ich die definierten Arrays in eine Liste schreiben?
Java:
	List<String> AuswahlArraylist = new ArrayList<String>();		
				
				for (int i=0, length = AuswahlArray.length;i < length; i++)	
{
				//Liste mit Inhalt füllen
					
					if ((AuswahlArray[i].equals("CL1")))
						AuswahlArraylist.add("Hier soll Array cl1 rein"); 
 //so funktionierts ja leider nicht: AuswahlArraylist.add(cl1);
				
					else if ((AuswahlArray[i].equals("CL2")))
						AuswahlArraylist.add("Hier soll Array cl2 rein");
					
					else if ((AuswahlArray[i].equals("CL3")))
						AuswahlArraylist.add("Hier soll Array cl3 rein");
					
					else if ((AuswahlArray[i].equals("CL4")))
						AuswahlArraylist.add("Hier soll Array cl4 rein");
					
					else if ((AuswahlArray[i].equals("CL5")))
						AuswahlArraylist.add("Hier soll Array cl5 rein");
					
					else if ((AuswahlArray[i].equals("CL6")))
						AuswahlArraylist.add("Hier soll Array cl6 rein");
					
					else AuswahlArraylist.add("Fehler");
				
				}
				
				Collections.sort(AuswahlArraylist);      //Liste sortieren
				System.out.println(AuswahlArraylist);	//Kontrollausgabe
 
Für diese Aufgabe nutzt man eine Map.

HashMap<String, int[]> map = new HashMap<String, int>();
map.put("cl1", new int[]{1,2,3});

int[] cl1 = map.get("cl1");

Gruß

MIMO

PS: Variablen werden klein geschrieben...
 
Sorry, ich hatte einen Fehler

Probier mal -> HashMap<String, int[]> map = new HashMap<String, int[]>();

Das sollte funktionieren...
 
Danke, der Fehler ist weg. Leider kenne ich mich mit Maps nicht aus und habe folgende Probleme mit der HashMap:

1.) Bei der Eingabe von mehreren gleichen cls, ( also Eingabe z.B.: cl2, cl4 cl1, cl2) werden diese nicht in einer eigenen Position in der Map gespeichert sondern überschrieben.

2.) Die Sortierung der Map soll anhand des Speicherinhalts einer bestimmten Position innerhalb des Arrays erfolgen und nicht nach Hashcode (z.B. nach erstem Wert in Array: cl1, cl3, cl3, cl3, cl2, cl4, cl4...)

3.) Die Ausgabe der Map zeigt nicht deren Inhalt, sondern deren Hashcode an

4.) Wie ist ein direkter Zugriff in der Map auf eine Position innerhalb eines Arrays möglich?


Java:
	static int cl1 [] = {10,8,6}; //Sortierung der cls nach dem ersten Wert im Array: cl1 cl3 cl2 cl5 c4 
	static int cl2 [] = {4,6,4};
	static int cl3 [] = {6,4,2};
	static int cl4 [] = {2,4,2};
	static int cl5 [] = {3,7,4};	
	
public static void main( String[] args )
  {
	HashMap<String, int[]> map = new HashMap<String, int[]>();

	
	map.put("cl1", cl1);
	map.put("cl2", cl2);
	map.put("cl3", cl3);
	map.put("cl4", cl4);
	map.put("cl5", cl5);

	int sizeOfMap=map.size();
	  System.out.println(sizeOfMap); 

	  for (String LängeMap : map.keySet())
		
		{
			
			System.out.println(LängeMap + " " + map.get(LängeMap));	
			
			
		}
 
Java:
static int cl1 [] = {10,8,6}; //Sortierung der cls nach dem ersten Wert im Array: cl1 cl3 cl2 cl5 c4 
    static int cl2 [] = {4,6,4};
    static int cl3 [] = {6,4,2};
    static int cl4 [] = {2,4,2};
    static int cl5 [] = {3,7,4};    
    
public static void main( String[] args )
  {
    HashMap<String, int[]> map = new HashMap<String, int[]>();
 
    
    map.put("cl1", cl1);
    map.put("cl2", cl2);
    map.put("cl3", cl3);
    map.put("cl4", cl4);
    map.put("cl5", cl5);
 
    int sizeOfMap=map.size();
      System.out.println(sizeOfMap); 
 
      for (String key : map.keySet())
        
        {
            
            int[] tmp = map.get(key);
            for(int i = 0; i < tmp.length; i++)System.out.println(key + " Eintrag(" + i ")=" + tmp[i]); 
            
        }

In einer HashMap werden Objecte unsortiert gespeichert und über einen Key referenziert. Versuchst Du nochmal etwas mit gleichen Key hinzuzufügen wird der Inhalt des Speicherplatzes überschrieben. Woher sollte die Map sonst auch später wissen welches Objekt Du gerne hättest. Durch den Aufruf der Methode .get(key) wird das abgelegte Objekt zurückgegeben, welches Du in einer Variablen aufnehmen und ansprechen kannst.

Sorry, aber das mit der Mehrfacheingabe habe ich überlesen. Da Du von einer Datenbank gesprochen hast, bin ich davon ausgegangen, dass der key auch als primary key dienen sollte. In dem Fall würde ich mit einer Liste arbeiten.

Java:
static int cl1 [] = {10,8,6}; //Sortierung der cls nach dem ersten Wert im Array: cl1 cl3 cl2 cl5 c4 
    static int cl2 [] = {4,6,4};
    static int cl3 [] = {6,4,2};
    static int cl4 [] = {2,4,2};
    static int cl5 [] = {3,7,4};    
    
public static void main( String[] args )
  {
    HashMap<String, int[]> map = new HashMap<String, int[]>();
    ArrayList<EinElement> list = new ArrayList<EinElement>();

    
    list.add(new EinElement("cl1", cl1));
    list.add(new EinElement("cl2", cl2));
    list.add(new EinElement("cl3", cl3));
    list.add(new EinElement("cl4", cl4));
    list.add(new EinElement("cl5", cl5));
 
    int sizeOfMap=list.size();
      System.out.println(sizeOfMap); 
 
      for (EinElement e: list)
        
        {
            
            int[] tmp = e.getValue();
            for(int i = 0; i < tmp.length; i++)System.out.println(e.getName() + " Eintrag(" + i ")=" + tmp[i]); 
            
        }

}

class EinElement(){
   
   private String name;
   private int[] value;


   public EinElement(String name, int[] value){
      this.name = name;
      this.value = value;
   }

   public String getName(){
      return name;
   }

   public int[] getValue(){
      return value;
   }

}

Gruß

MIMO
 
Hallo Mimo, vielen Dank für den Code.
Ich habe leider noch ein paar Fehlermeldungen, mit denen ich nicht zurechtkomme. Habe versucht über Google die Fehler zu finden. Aber die vorgeschlagene Korrektur führt nur zu weiteren Fehlern.

Zeile 40:

class EinElement(){

Syntax error on token "class", @ expected

Außerdem bekomme ich eine Meldung bei der geschweiften Klammer (Syntax error, insert "}" to complete Block). Klammern sollten eigentlich stimmen. Ich vermute der Fehler ist bereits in Zeile 6 durch die "public class Listefüllen" entstanden. Leider weiß ich nicht, wie ich das richtig aufbauen soll.



Java:
import java.util.HashMap;
import java.util.ArrayList;


public class Listefüllen {
	
    static int cl1 [] = {10,8,6}; 
    static int cl2 [] = {4,6,4};
    static int cl3 [] = {6,4,2};
    static int cl4 [] = {2,4,2};
    static int cl5 [] = {3,7,4};    
    
public static void main( String[] args )
  {
    HashMap<String, int[]> map = new HashMap<String, int[]>();
    ArrayList<EinElement> list = new ArrayList<EinElement>();
 
    
    list.add(new EinElement("cl1", cl1));
    list.add(new EinElement("cl2", cl2));
    list.add(new EinElement("cl3", cl3));
    list.add(new EinElement("cl4", cl4));
    list.add(new EinElement("cl5", cl5));
 
    int sizeOfMap=list.size();
      System.out.println(sizeOfMap); 
 
      for (EinElement e: list)
        
        {
            
            int[] tmp = e.getValue();
            for(int i = 0; i < tmp.length; i++)System.out.println(e.getName() + " Eintrag(" + i + ")=" + tmp[i]); 
            
        }
 
  }
 
class EinElement(){
   
   private String name;
   private int[] value;
 
 
   public EinElement(String name, int[] value){
      this.name = name;
      this.value = value;
   }
 
   public String getName(){
      return name;
   }
 
   public int[] getValue(){
      return value;
   }
 
}
	
	
}
 
Sorry, aber da gehört natürlich keine Klammer hin...

class EinElement(){ -> class EinElement{

Bin halt IDE geschädigt 😉
 
Das hatte ich sogar schon versucht. Dadurch entstehen neue Fehler in Zeile 20:

No enclosing instance of type Listefüllen is accessible. Must qualify the allocation with an enclosing instance of type Listefüllen (e.g. x.new A() where x is an instance of Listefüllen)
 
So hab den Code jetzt direkt gestestet...

Java:
import java.util.ArrayList;
 
 
public class Listefuellen {
    
    static int cl1 [] = {10,8,6}; 
    static int cl2 [] = {4,6,4};
    static int cl3 [] = {6,4,2};
    static int cl4 [] = {2,4,2};
    static int cl5 [] = {3,7,4};    
    
    public static void main( String[] args )
    {
    ArrayList<EinElement> list = new ArrayList<EinElement>();
 
    
    list.add(new EinElement("cl1", cl1));
    list.add(new EinElement("cl2", cl2));
    list.add(new EinElement("cl3", cl3));
    list.add(new EinElement("cl4", cl4));
    list.add(new EinElement("cl5", cl5));
 
    int sizeOfMap=list.size();
      System.out.println(sizeOfMap); 
 
      for (EinElement e: list)
        
        {
            
            int[] tmp = e.getValue();
            for(int i = 0; i < tmp.length; i++)System.out.println(e.getName() + " Eintrag(" + i + ")=" + tmp[i]); 
            
        }
 
   }
}
 
class EinElement{
   
   private String name;
   private int[] value;
 
 
   public EinElement(String name, int[] value){
      this.name = name;
      this.value = value;
   }
 
   public String getName(){
      return name;
   }
 
   public int[] getValue(){
      return value;
   }
 
}

Bitte versuche Dich aber an die Konventionen zu halten...

- Variablen und Methoden werden klein geschrieben
- Umlaute haben im Code(Bezeichner) nichts zu suchen
 
Der Code läuft wunderbar. Allerdings verstehe ich einige Zeilen noch nicht. Vieleicht kannst Du sie mir zum besseren Verständnis erklären?

[JAVA=26] for (EinElement e: list) [/code] 1. Welche Funktion hat "e: list" ?

[JAVA=30]int[] tmp = e.getValue(); [/code] 2.Was für Value ist das?

[JAVA=45] this.name = name;[/code] 3. Wofür ist "this."
 
Der Code läuft wunderbar. Allerdings verstehe ich einige Zeilen noch nicht. Vieleicht kannst Du sie mir zum besseren Verständnis erklären?

[JAVA=26] for (EinElement e: list) [/code] 1. Welche Funktion hat "e: list" ?

[JAVA=30]int[] tmp = e.getValue(); [/code] 2.Was für Value ist das?

[JAVA=45] this.name = name;[/code] 3. Wofür ist "this."


[JAVA=26] for (EinElement e: list) [/code]
Hier wird über jedes Element in der Liste iteriert und der Variablen e das aktuelle Element zu gewiesen.

Anders geschrieben:


Java:
for(int i=0;i<list.size();i++){ 
    EinElement e = list.get(i); //Hier wird das Objekt an der Stelle i aus der Liste zurückgegeben
    //usw.
}

[JAVA=30]int[] tmp = e.getValue(); [/code]
Ich habe unten im Code eine neue Klasse angelegt (EinElement). Diese nimmt über ihren Konstruktor die Attribute "name" vom Typ String und "value" vom Typ int[] auf. Im oberen Teil des Codes füge ich neue Elemente vom Typ "EinElement" der Liste hinzu (list.add(new EinElement("cl1",cl1))😉. Hierbei wird mit new EinElement(String, int[]) ein neues Objekt erzeugt. Beim iterieren über die Liste wird es irgendwann der Variablen "e" zugewiesen. Jetzt kann ich mittels der Methode "getValue()" mir das gespeicherte Array vom Typ "int[]" von "e" zurückgebenlassen.

[JAVA=45] this.name = name;[/code]
Ich übergebe in dem Konstruktor eine Variable mit dem gleichen Bezeichner wie das Attribut (name). Über "this" kann ich auf mein aktuelles Objekt zugreifen und somit mein Attribut ansprechen, welches mir von der lokalen Variablen verdeckt wird.

Ich hoffe es war jetzt einigermaßen verständlich, ansonsten ruhig weiter fragen...
 

Neue Themen


Zurück
Oben