Sachwortverzeichnis

H

Hartmut

Gast
ich muss nen Index bzw Sachwortverzeichnis eines Buches als Klasse implementieren. das heißt, eine Datenstruktur, die <begriff>: <seitenzahl 1> <seitenzahl 2> … <seitenzahl n> speichert.

folgendes habe ich bereits:
Java:
public class Index {
	private ArrayList<String> index;

	public Index() {
		index = new ArrayList<String>();
	}

	public Index(String begriff, int seite) {
		this.add(begriff, seite);
	}

	public Index(Index i) {
		this.index = (ArrayList<String>) i.index.clone();
	}

	public void add(String begriff, int seite) {
		if (!this.index.contains(begriff + ": " + seite)) {
			this.index.add(begriff + ": " + seite);
		}
		Collections.sort(this.index);
	}

	public String toString() {
		return "" + index;
	}
}

und zum Testen:
Java:
	public static void main(String[] args) {
		Index index = new Index();

		index.add("Test", 1);
		index.add("Schlagwort", 15);
		index.add("Schlagwort", 3);
		index.add("Schlagwort", 15);

		Index index2 = new Index(index);

		index2.add("Demo", 1);
		index2.add("Schlagwort", 7);

		System.out.println(index);
		System.out.println(index2);
	}

als Ausgabe bekomme ich:
[Schlagwort: 15, Schlagwort: 3, Test: 1]
[Demo: 1, Schlagwort: 15, Schlagwort: 3, Schlagwort: 7, Test: 1]

dabei sollte es so sein:
[Schlagwort: 3 15, Test: 1]
[Demo: 1, Schlagwort: 3 7 15, Test: 1]

was mache ich falsch??
 
G

Gast2

Gast
Java:
public void add(String begriff, int seite) {
  if (!this.index.contains(begriff + ": " + seite)) {
    this.index.add(begriff + ": " + seite);
  }
  Collections.sort(this.index);
}
Hier machst du ja nichts anderes zu prüfen ob die Kombination aus Begriff und Seite schon vorhanden ist, wenn nicht dann fügst du ihn hinzu. Das führt dann natürlich zu [Schlagwort: 15, Schlagwort: 3, Schlagwort: 7]
Du bräuchtest doch eher sowas wie ne
Code:
Map<String, List<Integer>>
, String ist der Begriff und die List<Integer> sind die Seitenzahlen.
 

njans

Top Contributor
Java:
this.index.add(begriff + ": " + seite);
Naja wenn du da Strings der Form "Schlagwort: 15" einbaust, was erwartest du ? ^^

Generell sieht das viel eher nach einem Fall für eine Map aus:
Java:
 Map<String,List<Integer>>

Damit kannst du dann die Seiten speichern, ohne das zu einem String zu wandeln.
 
H

Hartmut

Gast
mit Maps haben wir in der schule noch nie gearbeitet, deswegen hab ich da noch nicht viel ahnung von. aber ich lese mich gerade ins Thema ein und bin jetzt so weit:

Java:
	public void add(String begriff, int seite) {
		List seiten;
		
		if (!index.containsKey(begriff))
			seiten = new LinkedList<Integer>();
		else
			seiten = index.get(begriff);
		seiten.add(seite);
		index.put(begriff, seiten);
	}
jetzt sind leider schon wieder doppelte seiten ...
 
H

Hartmut

Gast
also ok, jetzt habe ich es bis auf toString hinbekommen. nur leider meinte der Tutor gerade, wir müssen das ohne Maps machen und dürften nur Listen verwenden.
 
G

Gast2

Gast
Das kannst du auch mit ner Liste erreichen, musst nur etwas kreativer denken. Zuerst brauchst du nen Datentyp der dir das Stichwort sowie ne Liste an Seiten kapselt, bspw.:

Java:
class BegriffSeiten {
  private String begriff;

  private List<Integer> seiten;

  [...]
}

In deiner Klasse Index hättest du dann ne
Java:
List<BegriffSeiten> index;

Beim einfügen einer neuen Begriff/Seiten Kombination prüfst du dann zunächst ob das Wort schon in der Liste vorhanden ist. Wenn ja dann holst du dir das entsprechende BegriffSeiten Objekt und fügst die Seite der Liste hinzu. Wenn der Begriff nicht vorhanden ist legst du nen neues BegriffSeiten Objekt an und fügst das der Liste hinzu.
 

Oben