Array einlesen, Int und Char

Status
Nicht offen für weitere Antworten.

Jen

Mitglied
Hallo zusammen!

Habe bei meinem Praktikum eine neue Aufgabe bekommen:

Ich soll eine Bücherliste mit verschiedenen Attributen einlesen. Dazu gehören u.a. Titel, Autor IBSN usw., also Worte sowie Zahlen und beides gemischt.

Jetzt die Frage:

Wie lese ich die Daten in ein Array ein?
Habe sie in einer .txt, die verschiedenen Bücher sind durch Zeilenumbrüche, die Attribute durch ein "|" getrennt.

Stichwortartige Antworten wären auch schon hilfreich, damit ich weiß, wonach ich weiter suchen muss (habe "Java ist auch eine Insel").
 
1. Eine statische Bücher-Methode Buch[] readFrom(File file) erstellen.
2. In dieser Methode zeilenweise einlesen eine ArrayList<Buch> befüllen
3. Eine nicht-statische Bücher-Methode parse(String) erstellen.
4. Diese Methode benutzt split("|") auf dem String um die
Komponenten zu extrahieren und füllt die Attribute der entsprechenden Buch-Instanz
5. Die ArrayList nach vollständigem Einlesen eventuell in ein Array umwandeln und zurückgeben
 
Okay danke schonmal.

Wie bekomme ich denn dieses File richtig ertellt bzw. bei Eclipse rein?
 
Ich verstehe das so, daß Jen seine Textdatei auch unter Eclipse angezeigt
bekommt und ändern kann. Wie macht man das (Es ist immerhin keine Java-Datei
die man einfach via New==>Class generieren und in das Projekt mit aufnehmen kann.
 
Wenn ein Programm was im Workspace ändert immer Refreshed werden.
Die Ausnahme ist ein Eclipse Plugin das den IFile Mechanismus verwendet.
 
Hm, könnte mir jemand vielleicht noch etwas allgemeinen Code dazu posten? Weiß nicht so ganz, wie ich da anfangen soll.. :?
 
Ich hänge schon bei 1. und 2. von Leroy und aus den Büchern werd ich auch nicht so richtig schlau.. :### ???:L
 
Code:
	private List<String> lines = new ArrayList<String>();

	private void readFromFile(File f)
	{
		try {
			BufferedReader reader = new BufferedReader(new FileReader(f));
			String s;
			while((s =reader.readLine())!=null)
			{
				lines.add(s);
			}
			reader.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
 
Richtig! Und in einem zweiten Aufwasch dann.

Code:
Buch[] bücher = new Buch[lines.size()];

int idx = 0;
for (String line : lines)
  bücher[i++] = new Buch().parseFrom(line);
...
class Buch {
  ...
  public Buch parseFrom(String source); {
    String[] elems = source.split("|");
    // Füllen der Buchattribute
   return this;
  }
}

Ich weiß jetzt allerdings nicht, ob in split("|") das '|' escaped werden muß
(und bin auch zu faul, da jetzt nachzuschauen :wink: )
 
Danke!

Ohje, kann mit dem noch nichts anfangen. 🙁

Hat zuufällig jemand Lust, den ganzen Code zu posten, dann würd ich versuchen, es mir damit zu erarbeiten. (Ich weiß, es ist blöde das zu fragen und ihr sollt ja keine "Hausaufgaben" erledigen.. Aber es würde mir trotzdem wahnsinnig helfen!)
 
Ich hoffe ja, dass ich das hier beherrsche, bevor ich 66 bin! :wink:
Übrigens find ich euere Hilfsbereitschaft bemerkenswert! :applaus:
 
Fertig! 😀

Code:
class Buch {
	String titel;
	int gewicht;
	
	static Buch[] readFromFile(File f) {
		List<Buch> bücher = new ArrayList<Buch>();
		try { 
			BufferedReader reader = new BufferedReader(new FileReader(f)); 
			String s; 
			while((s = reader.readLine())!=null) { 
				bücher.add(new Buch().parseFrom(s));
			} 
			reader.close(); 
		} catch (IOException e) {e.printStackTrace();} 
		return bücher.toArray(new Buch[] {});
		
	}

            public void toString() {
                    return String.format("Buch(<%s>, %d)", titel, gewicht);
            }
	
	public Buch parseFrom(String source) {
		String[] elems = source.split("|"); 
		gewicht = Integer.parseInt(elems[0]);
		titel = elems[1];
		return this; 
	} 
	public static void main(String[] args) {
		System.out.println(Buch.readFromFile(new File("Bücherliste.txt")));
	}
}
sollte auf eine Datei mit
Bücherliste.txt hat gesagt.:
42|LiesMich
24|ÜberliesMich
funktionieren.
 
Huiuiui! Danke! 😀
Dann mach ich mich gleich mal ans Verstehen! :idea:

-Edit 1:
Ahja: In welchem Verzeichnis muss denn dann Bücherliste.txt sein?
Und ich seh gerade, dass zwischen manchen Angaben mehrere "|" sind, ist das schlimm?

-Edit 2:
Muss ich dann für jede "Kategorie", die durch "|" getrennt werden, einen neuen String oder int machen?
 
Jen hat gesagt.:
Und ich seh gerade, dass zwischen manchen Angaben mehrere "|" sind, ist das schlimm?
Dafür musst du
Code:
source.split("|");
in
Code:
source.split("|+")
ändern.
 
Jen hat gesagt.:
Und ich seh gerade, dass zwischen manchen Angaben mehrere "|" sind, ist das schlimm?
:shock:
Aber sicher doch! Das ist eine Verschwendung sondergleichen!
Jetzt sag bloß noch, das du diese Datei auch ausdruckst.! :autsch:

Was das für einen zusätzlichen Verschleiß von Druckpatronen darstellt! :shock:
Unglaublich! :x
Dann bist du das also mit dem Regenwald... 🙁

Sorry, aber bei soviel Unverantwortlichkeit gegenüber unserer
Umwelt, geht mir die Hutschnur hoch!

( 😎 )
 
Ich sehe gerade, daß '|' in einem regulären Ausdruck doch escaped werden muß.

Hier nochmal die überarbeitete, lauffähige Version:

Code:
class Buch {
	String titel;
	int gewicht;
	static String datei = "42|LiesMich\n24|ÜberliesMich";
	
	static Buch[] readFromFile(File f) {
		List<Buch> bücher = new ArrayList<Buch>();
		try { 
			BufferedReader reader = new BufferedReader(new StringReader(datei)); 
			String s; 
			while((s = reader.readLine())!=null) { 
				bücher.add(new Buch().parseFrom(s));
			} 
			reader.close(); 
		} catch (IOException e) {e.printStackTrace();} 
		return bücher.toArray(new Buch[] {});
		
	}
	
	public Buch parseFrom(String source) {
		String[] elems = source.split("\\|");
		gewicht = Integer.parseInt(elems[0]);
		titel = elems[1];
		return this; 
	} 
	
	public String toString() { 
        return String.format("Buch(<%s>, %d)", titel, gewicht); 
}
	public static void main(String[] args) {
		System.out.println(Arrays.toString(Buch.readFromFile(new File("Bücherliste.txt"))));
	}
}
 
Ok, jetzt soll ich die Anzahl der Felder (Attriute) offen lassen und alle als String. Muss ich dann oben irgendwie "String[]" machen anstatt "String titel"?
 
Anonymous hat gesagt.:
Ok, jetzt soll ich die Anzahl der Felder (Attriute) offen lassen und alle als String. Muss ich dann oben irgendwie "String[]" machen anstatt "String titel"?
Sorry, nicht eingelogt. Und übrigens, ich muss das dann nicht ausdrucken. :wink: Allein schon aus dem Grund, dass es über 42.000 Artikel sind! :shock: Aber schön, dass sich jemand so um die Umwelt kümmet! :wink:

Edit:
Und vor allem noch: Wo muss die Texdatei liegen? Das findet die nicht.
 
Anonymous hat gesagt.:
Ok, jetzt soll ich die Anzahl der Felder (Attriute) offen lassen und alle als String. Muss ich dann oben irgendwie "String[]" machen anstatt "String titel"?

Natürlich nicht! In meinem Beispiel habe ich doch auch 2 verschieden Attributtypen:
Code:
class Buch { 
   String titel; 
   int gewicht;
   ...
}

Wobei gewicht aus den String via Integer.parseInt extrahiert wird:

Code:
public Buch parseFrom(String source) { 
      String[] elems = source.split("\\|"); 
      gewicht = Integer.parseInt(elems[0]); 
      titel = elems[1]; 
      return this; 
   }
 
So, nach in bisschen Umbauen hab ich jetzt das hier:

Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

class Demoshop {
	
   
   static Product[] readFromFile(File f) {
      List<Product> products = new ArrayList<Product>();
      try {
         BufferedReader reader = new BufferedReader(new FileReader(f));
         String s;
         int i = 0;
         while((s = reader.readLine())!=null) {
            products.add(new Product().parseFrom(s));
            i++;
            System.out.println(i);
         }
         reader.close();
      } catch (IOException e) {e.printStackTrace();}
      return products.toArray(new Product[] {});
      
   }

            public String toString() {
                    return String.format("Product(<%s>, %d)", A1);
            }
   
   public static void main(String[] args) {
      System.out.println(readFromFile(new File("C:/src/java/anwendungen/Demoshop/Liste")));

   }
}
zusammen mit der Klasse
Code:
public class Product {


	   public Product parseFrom(String source) {
		      String[] elems = source.split("\\|");

		      		      
		      return this;
		   }

	   
}

Jetzt soll ich den Demoshop dazu bekommen, mir einzelne elems auszugeben. Wie bekomm ich die denn von Product "rüber"?
 
So, erstens hab ich wieder mal vergessen mich einzuloggen und zweitens hab ich es selbst hinekommen mit System.out.println(elems[1]) in der Klasse Products. Laaaaaaaaaangsam blick ich durch!
 
Ok, jetzt soll ich einen Parameter von der main in die readFromFile und dann in die parse übergeen. Wie macht man das?
 
Code:
static Product[] readFromFile(File f, MeinTyp einParameter) {

oder was meinst du genau?
 
Und wie bekomm ich dahin einen Wert übergeben?
Vor allem eben aus der main. :bahnhof:
 
Code:
static Product[] readFromFile(File f, int einInt) {

...

static void main(String[] args) {
   readFromFile(new File("erna"), 42);
 
Wird immer besser. 😀

Aber: Wie kann ich jetzt einen Treffer ausgeben, wenn mein übergebener Parameter "ArtNr" in "elems[0]" vorkommt?
Als noob hab ich so angefangen, aber das klappt nicht, weil ich ja keine Strings mit "==" vergleichen kann:

Code:
	public Product parseFrom(String source, String ArtNr) {
		      String[] elems = source.split("\\|");
		      
		 if (ArtNr == elems[0]){
		      System.out.println("Treffer: " + elems[0]);
		 }
Gibt es sowas wie nen Element-Operator, mit dem ich schaun kann, ob ArtNr in elems drin is?
 
Code:
if (elems.length > 0 && artNr.equals(elems[0])) {

Gewöhn dir am besten gleich an, NUR Klassennamen und
static final - Konstanten mit einem großen Buchstaben beginnen zu lassen.

Alles andere mit kleinem Buchstaben anfangen.
 
Jen hat gesagt.:
Gibt es sowas wie nen Element-Operator, mit dem ich schaun kann, ob ArtNr in elems drin is?

Nein! Ich denke es würde in deinem Fall auch keinen Sinn machen,
da die Artikelnummer immer an derselben Position stehen muß.

Wie solltest du sonst unterscheiden können, welches Attribut du gerade behandelst? ???:L
 
Ahja danke!
Unter welchem Begriff find ich denn dieses .length und .equals usw. in meinem schauen Buch?
 
Im Index? ???:L

Erstens weiß ich nicht, welches schlaue Buch sich bei dir rumtreibt
und zweitens solltest du ein Tutorial durcharbeiten, da wirst du automatisch
mit diesen Sachen(Arrays, Stringvergleiche, ...) bekannt gemacht.
 
Tut mir leid, falls ich ständig blöde Fragen stelle..
(Das Buch ist übrigens u.a. "Java ist auch eine Insel" und ich möchte bei Zeiten auch einen oder besser gleich mehrere Tutorials machen.)

Jetzt eine neue (hoffentlich für alte Hasen einigermaßen erträgliche :wink: ) Frage:

Wie kann ich an "elems" sehen, wie oft gesplittet wurde bzw. wie viele Einträge es pro Artikel gibt?
 
Nee das hab ich nicht vorgegeben. Und genau da soll ich jetzt anknüpfen.
Ich soll eine Hashmap anlegen, die die Spalten benennt.

Der Anfang sieht so aus, die Zahen sind die Nummer der Spalte und daneben der Titel:
Code:
import java.util.HashMap;
import java.util.Map;


public class Product {


	public Product parseFrom(String source, String ArtNr) {
		      String[] elems = source.split("\\|");
		      
		      
	 if (ArtNr.equals(elems[0])) {
    	  System.out.println("Treffer: " + elems[0]);
    	  
    		for (int i = 0; i < elems.length; i++ ){
    			System.out.println(elems[i]);
    		}
    	  
	 }
	
	 
	 
	 Map<String, String> category = new HashMap<String, String>();
	 category.put("0", "Artikelnummer");
	 category.put("8", "EAN");
	 category.put("1", "Titel");
	 category.put("3", "Beschreibung");
	 category.put("14", "Kategorie");
	 category.put("31", "Unterkategorien");
	 category.put("9", "Hersteller");
	 category.put("6", "Preis");
	 category.put("34", "Systemvorraussetzung");
	 category.put("15", "Artikelzustand");
	 category.put("17", "Artikelstatus");
	 category.put("16", "Freigabe");
	 category.put("5", "Bild");
	 category.put("24", "MagicEdition");
	 category.put("25", "MagicFarbe");
	 category.put("27", "MagicSprache");
	 category.put("28", "MagicSeltenheit");
	 category.put("26", "MagicKartentyp");
	 category.put("36", "YuGiOhEdition");
	 category.put("37", "YuGiOhSeltenheit");

	      
		      return this;
		   }

	   
}
Jetzt muss ich das aber irgendwie mit elems verbinden, sodass ich (mit "category.get()" ?) von allen Artikeln zum Beispiel den Preis ausgeben kann.

Ist der Ansatz richtig oder muss ich das anders lösen?
 
:shock: :autsch:

Jetzt mal ganz in Ruhe 😀

Was hast du vorgegeben? Was steht in deiner Datei durch | getrennt,
poste doch einfach mal ein paar Zeilen deiner Datei.

Was sollst du später mit den eingelesenen Daten machen. Das ist entscheidend
zur Wahl der Datenstruktur in die du einliest.
 
Na gut *durchatem* 😀

Also die Liste sieht so aus, nur viiieeel länger:
Code:
7400-2338|(EB) Hidden & Dangerous AddOn - Fight for Freedom|||Schnäppchen||||||||||||||Actionspiel,Zusatz-CD||||||||252698
Edit: Gekürzt, damit das hier weider schön reinpasst.

Jetzt habe ich (/wir :wink: ) ja das Programm bisher so, dass bei den "|" gesplittet wird und die Spalten in elems[] gespeichert werden, z.b. elems[0] sind die Artikelnummern.
Jetzt soll ich die ganzen Spalten mit Hilfe von einer Hashmap benennen.

Edit: Zeile 12 - 19 müsste man hierfür weglassen (können), denk ich.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben