HashTables

Status
Nicht offen für weitere Antworten.

SnooP

Top Contributor
Telefonverzeichnisse... - alles was Daten anhand eines Schlüssels (key) abspeichert, so dass jeweils Paare mit Wert&Schlüssel in einer Zeile einer Hashtabelle gespeichert werden.

Das Speichern der Werte - also der Speicherort (welche Zeile der Tabelle) ist dabei nicht linear, will sagen nicht 1. dann 2. dann 3. Zeile, sondern abhängig von der hash-funktion und dem hashwert des jeweils zu speichernden keys... - aber dazu gibt's genügend Informationen auch im netz und ist für den Einsatz der Hashtabellen auch nicht weiter relevant... - wichtig zu wissen ist, dass es ne recht schnelle Speichermöglichkeit darstellt.

P.S. änder doch bitte mal deine Sig -die zieht bei mir das layout ziemlich auseinander...
 

X-Treme

Bekanntes Mitglied
Jo THX! Ich habe ein Prog geschrieben, dass eine Textdatei durchsucht und feststellt, ob der Text darin Englisch oder Deutsch ist! Ich will es jetzt aber mit Hashtables verändern! Ich habe es vorher mit equals gemacht! Hier der Code:

Code:
import java.io.*;
import java.util.*;


public class Sprachen
{
	private static int englisch = 0;
	private static int deutsch = 0;
  
	private static void istDeutsch(String satz) 
	{
	String[] temp2 = satz.split(" ");
	for(int i =0; i<temp2.length; i++)
	{
		String wort2 = temp2[i];
		if(wort2.equals("der") || wort2.equals("die") || 
                wort2.equals("und") || wort2.equals("in") || 
                wort2.equals("den") || wort2.equals("von") || 
                wort2.equals("das") || wort2.equals("mit") || 
                 wort2.equals("zu") || wort2.equals("sich") || 
                   wort2.equals("dies") || wort2.equals("ein") ||
                  wort2.equals("ich") || wort2.equals("Ich"))
		{
			deutsch++;
		}
	}
}      
	private static void istEnglisch(String satz)
	{
		String[] temp = satz.split(" ");
		for(int i =0; i<temp.length; i++)
		{
			String wort = temp[i];
			if(wort.equals("is") || wort.equals("a") || 
                        wort.equals("I") || wort.equals("of") || 
                         wort.equals("to") || wort.equals("and") || 
                          wort.equals("for") || wort.equals("the") || wort.equals("that") 
                       || wort.equals("on") || wort.equals("are"))
			{
				englisch++;
			}
		}
	}
	public static void main (String[] args) 
	{
		try 
	{                       
		BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
		String line;
		while( (line = stdin.readLine()) != null)  
		{
			istDeutsch(line);
			istEnglisch(line);
		}
		} 
			catch(IOException ex) 
			{
				System.out.println(ex);
			}
			if(englisch > deutsch) 
			{
				System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
			} 
			else if(deutsch > englisch) 
			{
				System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
			} 
			else 
			{
				System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
			}
		} 
	}

So funktioniert es wohl, aber ich will die Zeit verkürzen die das Prog braucht um die Datei zu Überprüfen! Also hab ich mir gedacht das mit hashtables zu machen!

also so:

Code:
HashSet english=new HashSet();
english.add("the");
english.add("a");
if(english.contains(word)) 
englisch++;

usw. aber ich versteh nicht ganz, was ich von meiner alten Methode weglassen muss und was nicht!?!?!

MfG

X-Treme
 
B

Beni

Gast
Code:
Set english = ... // wird irgendwo gefüllt
if( english.contains( word )){
  // das word war in der Menge "english".
}
 

X-Treme

Bekanntes Mitglied
Ich hab jetzt mal die istDeutsch Methode mit HashSet verändert!

Code:
private static void istDeutsch(String satz) 
	{
	String[] temp2 = satz.split(" ");
	for(int i =0; i<temp2.length; i++)
	{
		String wort2 = temp2[i];
		HashSet german = new HashSet();
		german.add("der"); 
		german.add("die");
		german.add("das");
		german.add("ist");
		german.add("war");
		german.add("dies");
		german.add("ein");
		german.add("Ich");
		german.add("von");
		german.add("den");
		german.add("für");
		german.add("in");
		german.add("dem");
		german.add("mit");
		german.add("sich");
		if(german.contains( wort2 )
		{
			deutsch++;
		}
	}

Was ist jetzt daran Falsch?
 
S

SlaterB

Gast
'der' muss dir doch eine Zeile nennen, ansonsten würde ich mir schleunigst einen 'anderen' suchen

if(german.contains( wort2 )
{

da fehlt wohl eine schließende Klammer,

wenn du übrigens bei jedem Vergleich die Hashmap neu erstellst und neu füllst mit allen Wörtern,
dann ist das noch langsamer als das if,

die Map nur EINMAL erzeugen und füllen, und dann wiederverwenden,

und ändere doch mal deine Codeblöcke aus früheren Posts,
bei den langen Zeilen Zeilenumbrüche!,
so kann man ja nix mehr lesen
 

AlArenal

Top Contributor
X-Treme hat gesagt.:
Wo füll ich die den mehrmals? Ich sag "Ihm" doch nur HashSet und was darein kommt! und dann bleibt das doch drin oder wie ist das?

Ja, das bleibt drin bis zum nächsten Schleifendurchlauf, weil du dann wieder eine neue Instanz generierst, sie neu befüllst und das Murmeltier aufs Neue grüßt...
 
S

SlaterB

Gast
oder gleich statisch:

Code:
private static Map german..

private static void istDeutsch(String satz)
   {

  if (german== null) {
    fill german..
  }

   String[] temp2 = satz.split(" ");
   for(int i =0; i<temp2.length; i++)
   {
      String wort2 = temp2[i];
      if(german.contains( wort2 ))
      {
         deutsch++;
      }
   }

> Woher kriegt er denn die Zeile?
ein normaler Compiler sagt
'error: .... at line 17'

wenn nirgendwo die Zeile angegeben ist, dann kann man nicht mehr viel machen,
wer sagt dir das denn?,
benutzt du javac Klasse.java in der Konsole oder welches Programm?
 

DocRandom

Top Contributor
Hi X-Treme!

Nun, da Java ja eine OO - Sprache ist, wollen wir mal Dein Problem auch Objekt orientiert lösen! ;)
Wie ich nun feststellen mußte, produzierst Du unnötigen Code.
Ein HashSet zu verwenden war/ist jedoch schon mal ein guter Ansatz.

Unnötig deshalb, weil Du gleichen Code nicht in einer Klasse kapselst
So, hier mal ein Vorschlag meinerseits:

Words.java
Code:
import java.util.*;

public class Words {
	// das HashSet-Objekt
	private HashSet woerter;
	// die Zaehlervariable
	private int matchcount;
	
	// Konstruktor
	public Words (String[] wort) {
		// Klasse wird neu erstellt ergo Zaehler auf 0
		matchcount = 0;
		// die übergebenen Woerter ab ins HashSet
		woerter = new HashSet();
		for ( int i = 0; i < wort.length; i++) {
			woerter.add(wort[i]);
		}
	}
	/*
	 * Vergleicht den Inhalt von Satz mit dem HashSet
	 */
	public void checkMatched(String satz) {
		String[] tmp = satz.split(" ");
		for ( int i = 0; i < tmp.length; i++) {
			if (woerter.contains(tmp[i]))
				matchcount++;
		}
	}
	/*
	 * gibt die Treffer aus
	 */
	public int getMatchCount() {
		return matchcount;
	}
}
..jetzt brauchst Du in Deiner Main nur noch für jede Sprache ein Words-Objekt erstellen.
.z.B.:
Code:
...
Words english = new Words("is", "a","of", "to","and","for","the","that","on","are");
Words german = new Words("der","die","und","in","den","von","das","mit");
....

..der Code denke ich, ist selbsterklärend!

mfg
DocRandom
 

X-Treme

Bekanntes Mitglied
Erstmal danke DOC probier das sofort aus!^^
wenn nirgendwo die Zeile angegeben ist, dann kann man nicht mehr viel machen,
wer sagt dir das denn?,
benutzt du javac Klasse.java in der Konsole oder welches Programm?

Ja ich benutze die Konsole unter Linux mit Javac Klasse.java

Thx

X-Treme
 

X-Treme

Bekanntes Mitglied
Kleine Frage, wenn ich die Methoden jetzt einbinde was wird alles dadurch überflüssig? Also den Counter deutsch und englisch gibts nicht mehr und weiter? oder besser gesagt, was muss in der Mainfunktion weggelassen werden? Hey DOC du hast doch in deiner nur einen Zaehler! Und die Methode zaehlt auch nur ein HashSet oder?

MfG

X-Treme
 

X-Treme

Bekanntes Mitglied
Also im Moment sieht meine Main so aus:
Code:
public static void main (String[] args) 
{
	try 
{                       
		BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
		String line;
		while( (line = stdin.readLine()) != null)  
		{
			istDeutsch(line);
			istEnglisch(line);
			Words english = new Words("is", "a","of", "to","and","for","the","that","on","are");
			Words german = new Words("der","die","und","in","den","von","das","mit"); 
		}
		} 
			catch(IOException ex) 
			{
				System.out.println(ex);
			}
			if(englisch > deutsch) 
			{
				System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
			} 
			else if(deutsch > englisch) 
			{
				System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
			} 
			else 
			{
				System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
			}
		} 
	}

Hier is viel überflüssig, dass weiß, aber ich weiß nicht was genau^^
 

X-Treme

Bekanntes Mitglied
Ich weiß nur, dass es die Methoden istDeutsch & istEnglisch nicht mehr gibt! Und das die Counter nicht mehr da sind!
 

X-Treme

Bekanntes Mitglied
Wenn ichs so mach spuckt der Compiler mir noch 2 Fehler aus!

Code:
public static void main (String[] args) 
{
	try 
{                       
		BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
		String line;
		while( (line = stdin.readLine()) != null)  
		{
			Words english = new Words("is", "a","of", "to","and","for","the","that","on","are");
			Words german = new Words("der","die","und","in","den","von","das","mit"); 
		}
		} 
		catch(IOException ex) 
		{
			System.out.println(ex);
		}
		if(Words english) 
		{
			System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
		} 
		else if(Words german) 
		{
			System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
		} 
		else 
		{
			System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
		}
	}

p.s. Sorry für die vielen Posts^^ is noch so früh...^^
 

X-Treme

Bekanntes Mitglied
lol Die hier:

Words.java:50: ')' expected
if(Words english > Words german)
^
Words.java:62: illegal start of expression
}
^
2 errors

Das kann aber nicht! Wo sollen denn da noch Klammern hin?
 

Murray

Top Contributor
Wenn du DocRandoms Ansatz verwenden willst, musst du auch die Methoden der Kasse Word aufrufen; das könnte wohl in etwa so aussehen:
Code:
public static void main (String[] args) {
   try {

      Words english = new Words("is", "a","of", "to","and","for","the","that","on","are");
      Words german = new Words("der","die","und","in","den","von","das","mit");
                       
      BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
      String line;
      while( (line = stdin.readLine()) != null) {
        english.checkMatched( line);
        german.checkMatched( line);
      }
  } catch(IOException ex) {
    System.out.println(ex);
  }
  if( english.getMatchCount() > german.getMatchCount()) {
         System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
  } else if( german.getMatchCount() > english.getMatchCount()) {
         System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
  } else {
         System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
  }
}
 
S

SlaterB

Gast
zunächst mal erzeugst du diese Objekte immer noch in der while-Schleife,
also mehrmals, das solltest du dir doch als erstes abgewöhnen,
einmal erzeugen und wiederverwenden!

und dann macht der Versuch zu programmieren, doch keinen Sinn,
wenn man nicht nachdenkt?

die eingelesen Zeilen verwendest du nirgendwo!

"if(englisch > deutsch)" bzw. "if(Words english) "
was soll die Bedeutung dieser Zeilen sein?
die machen doch keinen Sinn, du musst dir doch erstmal gedanklich überlegen,
was zu tun ist, und dann erst umsetzen,

----------

wenn du nicht weißt, wie man die neue Klasse einsetzt,
dann frage lieber direkt, statt sowas zu posten,
die Bedienung dieser Klassen sieht in etwa so aus:
(ungetestet, können noch Fehler drin sein)

Code:
public static void main (String[] args)
{
         Words english = new Words("is", "a","of", "to","and","for","the","that","on","are");
         Words german = new Words("der","die","und","in","den","von","das","mit");

   try
{                       
      BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
      String line;
      while( (line = stdin.readLine()) != null) 
      {
        english.checkMatched(line);
        german.checkMatched(line);
      }
      }
      catch(IOException ex)
      {
         System.out.println(ex);
      }
      int numberGerman = german.getMatchCount();
      int numberEnglish = english.getMatchCount();


      if(numberGerman > numberEnglish )
      {
         System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
      }
      else if(numberEnglish > numberGerman)
      {
         System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
      }
      else
      {
         System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
      }
   }
 

X-Treme

Bekanntes Mitglied
Was hat dieser Fehler zu bedeuten?
Words.java:37: cannot find symbol
symbol : constructor Words(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.
String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)
location: class Words
Words english = new Words("is", "a","of", "to","and","for","the","that","on","are");

p.s. GANZ NORMALE FRAGE (HAB KEIN BUCH MIT FEHLER CODES & AUS DEM WIRWAR DA, ERKENNE ICH NUR DAS ER IRGENDWAS NET FINDET, WIE MAN UNSCHWER AN CANNOT FIND SYMBOL ERKENNEN KANN)

MfG

X-Treme
 
S

SlaterB

Gast
der Konstruktor verlangt ein String-Array mit allen Wörtern,
nicht die Wörter direkt als Parameter..

wie man ein String-Array anlegt weißt du hoffentlich?

falls du Java 1.5 benutzt geht evtl, folgender Konstruktor:
public Words (String.. wort) { // so wie es da steht mit zwei Punkten
// Rest so wie bisher
}
zusammen mit deinem bisherigen Aufruf
 

X-Treme

Bekanntes Mitglied
wenn du nicht weißt, wie man die neue Klasse einsetzt,
dann frage lieber direkt, statt sowas zu posten,

Wenn man das tut heißt es doch eh nur wir machen keine Hausaufgaben! Und das is ja auch nicht sinn und zweck der Sache! Ich will ja Java lernen! Ich hab schonmal gesagt, dass ich nicht der absolute Profi bin! Ich frag halt nach in dem Glauben, dass hier Kompetentere Leute posten und einem mit Hilfe Stellungen dienen. Is ja net so, dass ich nicht Nachdenke oder so, aber wenn ich das alles nicht kenn (Und z.B. bei Gailer-Net oder dpunkt.de nicht damit weiter komm) dann hab ich das Gefühl, dass die Fragen hier richtig plaziert sind!

MfG

x-Treme

p.s. das war jetzt ein bischen Off-Topic, aber naja
 

X-Treme

Bekanntes Mitglied
Das ist ein String-Array oder?

Code:
String[] english = new String[]{"a", "is", "are", "am", "this", "I"};
 
S

SlaterB

Gast
naja, hier wurde ja schon sehr viel geschrieben, gar eine eigene Word-Klasse, dann gehört auch ein wenig dazu diese zu erklären,

ein Post wie 'ich weiß nicht wie man diese Klasse benutzt' hätte dann vielleicht wirklich nicht direkt zu Code geführt,
wäre aber eine viel bessere Diskussionsgrundlage,
z.B. könnte man dann in Textform diskutieren was die Klasse überhaupt an Operationen bietet,
in welcher Reihenfolge man die wohl benutzen muss,

schau dir die Klasse doch an:
ein Konstruktor,
eine Operation um Zeilen zu analysieren
und eine Operation um Ergebnisse auszulesen,

das ist ja fast schon zu simpel um überhaupt über einen Ablauf nachzudenken,
mit einer Frage danach hätte man das trotzdem tun können,
bzw. vielleicht wäre dir schon beim Formulieren der Frage/
beim Formulieren DEINER PROBLEME MIT DEM UMGANG MIT DER KLASSE was eingefallen,

aber so wie du deinen Code postest sieht es so aus als wenn du gar nicht nachdenkst
sondern nur wahllos den Klassennamen irgendwo einfügst,
das ist schlecht
 

X-Treme

Bekanntes Mitglied
Auch noch mal mein Code, damit Ihr nachvollziehen könnt was ich da mache^^

Code:
import java.util.*;
import java.io.*;

public class Words 
{
	private HashSet woerter;
	private int matchcount;
	
	public Words (String[] wort) 
	{
		matchcount = 0;
		woerter = new HashSet();
		for ( int i = 0; i < wort.length; i++) 
		{
			woerter.add(wort[i]);
		}
}
public void checkMatched(String satz) 
{
	String[] tmp = satz.split(" ");
	for ( int i = 0; i < tmp.length; i++) 
	{
		if (woerter.contains(tmp[i]))
		{
			matchcount++;
		}
	}
}
public int getMatchCount() 
{
	return matchcount;
}
public static void main (String[] args) 
{
try 
{
	String[] english = new String[]{"a", "is", "are", "am", "this", "I"};
	String[] german = new String[]{"der", "die", "das", "ist", "dies", "Ich", "einem", "eine", "mit", "für"};
                       
	BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
	String line;
	while( (line = stdin.readLine()) != null) 
	{
		english.checkMatched( line);
		german.checkMatched( line);
	}
	}
		catch(IOException ex) 
	{
		System.out.println(ex);
	}
		if( english.getMatchCount() > german.getMatchCount()) 
	{
		System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
	} 
		else if( german.getMatchCount() > english.getMatchCount()) 
	{
		System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
	} 
	else 
		{
			System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
		}
	} 
}
 
S

SlaterB

Gast
String[] englishArray = new String[]{"a", "is", "are", "am", "this", "I"};
String[] germanArray = new String[]{"der", "die", "das", "ist", "dies", "Ich", "einem", "eine", "mit", "für"};


Words english = new Words(englishArray);
Words german = new Words(germanArray );

siehe auch mein Post kurz vor deinem falls beim Schreiben übersehen
 

X-Treme

Bekanntes Mitglied
Ich habe jetzt noch ein Problem mit der Bildschirmausgabe! (Auf Textebene bitte^^) Also bei der Ausgabe (z.B. english.getMatchcount())! Ich würde wohl gerne wissen ob man english & german vllt noch irgendwo deklarieren oder intialsieren muss. So wie ich das verstanden hab nimmt der Compiler nähmlich english und german als varable und kann die deßhalb nicht finden!

Ohne irgendwelche Fehlermeldungen zu posten^^ Ich hab auf jeden Fall noch 4 Fehler und eine Warnung
 
S

SlaterB

Gast
wenn dir der grundsätzliche Vorgang 'Zahl aus Klasse auslesen und weiterverwenden' klar ist
(ein solcher Aufruf fehlte früher)

dann machen Code und Fehlermeldungen wieder mehr Sinn ;)

ich hatte ja schonmal irgendwo

int numberGerman = german.getMatchCount();
int numberEnglish = english.getMatchCount();

vorgeschlagen, mit diesen ints kannst du alles mögliche machen,
was da nun dein Problem ist wird noch nicht klar

> So wie ich das verstanden hab nimmt der Compiler nähmlich
> english und german als varable und kann die deßhalb nicht finden!
irgendwo müssen die Word-Objekte ja sein um getMatchCount() aufzurufen,
wenn die nicht da sind dann hast du ein ganz anderes Problem
 
L

Leroy42a

Gast
X-Treme hat gesagt.:
Ohne irgendwelche Fehlermeldungen zu posten^^ Ich hab auf jeden Fall noch 4 Fehler und eine Warnung

Ich denke es macht doch mehr Sinn wenn du dein ganzes Programm
nochmal postest, wir können ja nicht wissen, was du bzgl. deines letzten
Postings verändert hast.
 

X-Treme

Bekanntes Mitglied
ich hatte ja schonmal irgendwo

int numberGerman = german.getMatchCount();
int numberEnglish = english.getMatchCount();

vorgeschlagen, mit diesen ints kannst du alles mögliche machen,
was da nun dein Problem ist wird noch nicht klar

So weit ich weiß nicht, aber kann mich irren (hab jetzt nicht nachgekuckt)
Mein Problem ist einfach Das, dass (selbst wenn ich die Variablen einsetzte (von dir) er mir immer noch die selben Fehlermeldungen ausspuck!

desweiteren an Lerroy ich hab noch nichts weiter verändert bis auf das ich die Variablen eingefügt hab! Also kannst du den letzten Code Post ruhig nehmen um irgendwas zu erklären (falls du das wolltest!)

MfG

X-Treme
 
S

SlaterB

Gast
in dem zuletzt von dir geposteten Code fehleten die Words ja vollständig,
darauf hatte ich schon geantwortet:

String[] englishArray = new String[]{"a", "is", "are", "am", "this", "I"};
String[] germanArray = new String[]{"der", "die", "das", "ist", "dies", "Ich", "einem", "eine", "mit", "für"};


Words english = new Words(englishArray);
Words german = new Words(germanArray );

gut du sagst du hast die schon eingefügt, dann zeig doch mal wirklich den Code,
mehr kann man ungesehen nicht raten
 

X-Treme

Bekanntes Mitglied
Weiß aber nicht ob das so richtig ist! für mich wär das so logisch (Aber auch ohne Variblen die selben Fehler

Code:
import java.util.*;
import java.io.*;

public class Words 
{
	private HashSet woerter;
	private int matchcount;
	
	public Words (String[] wort) 
	{
		matchcount = 0;
		woerter = new HashSet();
		for ( int i = 0; i < wort.length; i++) 
		{
			woerter.add(wort[i]);
		}
}
public void checkMatched(String satz) 
{
	String[] tmp = satz.split(" ");
	for ( int i = 0; i < tmp.length; i++) 
	{
		if (woerter.contains(tmp[i]))
		{
			matchcount++;
		}
	}
}
public int getMatchCount() 
{
	return matchcount;
}
public static void main (String[] args) 
{
try 
{
	String[] englishArray = new String[]{"a", "is", "are", "am", "this", "I"};
	String[] germanArray = new String[]{"der", "die", "das", "ist", "dies", "Ich", "einem", "eine", "mit", "für"};

	int numberGerman = german.getMatchCount();
	int numberEnglish = english.getMatchCount();                   
	Words english = new Words(englishArray);
	Words german = new Words(germanArray ); 

	BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
	String line;
	while( (line = stdin.readLine()) != null) 
	{
		english.checkMatched( line);
		german.checkMatched( line);
	}
	}
		catch(IOException ex) 
	{
		System.out.println(ex);
	}
		if( numberEnglish > numberGerman ) 
	{
		System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
	} 
		else if( numberGerman > numberEnglish ) 
	{
		System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
	} 
	else 
		{
			System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
		}
	} 
}

Für verständnis noch die Fehlercodes:

Words.java:40: cannot find symbol
symbol : variable german
location: class Words
int numberGerman = german.getMatchCount();
^
Words.java:41: cannot find symbol
symbol : variable english
location: class Words
int numberEnglish = english.getMatchCount();
^
Words.java:57: cannot find symbol
symbol : variable numberEnglish
location: class Words
if( numberEnglish > numberGerman )
^
Words.java:57: cannot find symbol
symbol : variable numberGerman
location: class Words
if( numberEnglish > numberGerman )
^
Words.java:61: cannot find symbol
symbol : variable numberGerman
location: class Words
else if( numberGerman > numberEnglish )
^
Words.java:61: cannot find symbol
symbol : variable numberEnglish
location: class Words
else if( numberGerman > numberEnglish )
^
Note: Words.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
6 errors
 

Murray

Top Contributor
Dieser Block
Code:
int numberGerman = german.getMatchCount();
int numberEnglish = english.getMatchCount();
gehört hinter die While-Schleife
 

X-Treme

Bekanntes Mitglied
Jo das hat schonmal 2 Fehler gekillt! Aber immer noch das Problem, dass der Compiler die Variablen nicht finden kann!
 

AlArenal

Top Contributor
Vielleicht solltest du dir mal die Reihenfolge anschauen... Ich kann den Wagen auch nicht anlassen, wenn ich noch nicht drin sitze...
 

X-Treme

Bekanntes Mitglied
Vielleicht solltest du dir mal die Reihenfolge anschauen...

Meinst die Reihenfolge in der while-schleife? Murray hat doch gesagt, dass die Variablen hinter die while-Schleife müssen! Jetzt versteh ich garnichts mehr??!?!? :autsch:
 
L

Leroy42a

Gast
Code:
String[] englishArray = new String[]{"a", "is", "are", "am", "this", "I"}; 
   String[] germanArray = new String[]{"der", "die", "das", "ist", "dies", "Ich", "einem", "eine", "mit", "für"}; 

   Words english = new Words(englishArray); 
   Words german = new Words(germanArray ); 

   BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt")); 
   String line; 
   while( (line = stdin.readLine()) != null) 
   { 
    //...
      german.checkMatched( line); 
   } 

   int numberGerman = german.getMatchCount(); 
   int numberEnglish = english.getMatchCount();                    

      if( numberEnglish > numberGerman ) 
   { 
      System.out.println("Der Text in der Datei ist wahrscheinlich englisch"); 
   } 
      else if( numberGerman > numberEnglish ) 
   { 
      System.out.println("Der Text in der Datei ist wahrscheinlich deutsch"); 
   } 
   else 
      { 
         System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!"); 
      } 
   } 
}
 

Murray

Top Contributor
Nee, die Reihenfolge stimmt jetzt schon (also dann, wenn die beiden ints hinter der while-Schleife dekalriert und zugewiesen werden). Das Problem ist jetzt noch der try-catch-Block, der ja einen eigenen Sichtbarkeitsbereich definiert - alles was darin deklariert wird, ist nur in diesem Block sichtbar. Pack das try vor die Zuweisung des BufferedReaders.

//EDIT: Leroys Post hatte ich noch nicht gesehen - OK, man kann den try-catch-Block natürlich auch um die gesamte main-packen (das impliziert das Fragment wohl), aber ganz weglassen geht nicht.
 

AlArenal

Top Contributor
Oops, hab den Murray ganz überlesen (sorry, Matthias ;) ).

Poste nochmal deinen aktuellen Code und deine Fehler. Wenn du es so gemacht hast wie Murray schrub, sollte eigentlich alles passen, weil der Rest Folgefehler waren. Aber wer weiß schon (außer dir), was du nun wieder gemacht hast? ;)

EDIT:
Och, nu war ich mal end-zu-langsam. :(
So eine krude Code-Formatierung machts einem auch nicht gerade einfacher. Programmier mal besser in Python! :p
 

X-Treme

Bekanntes Mitglied
Pack das try vor die Zuweisung des BufferedReaders.

Meinst du so?

Code:
.....
        try 
	{
	BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
	String line;
	while( (line = stdin.readLine()) != null) 
	{
....

Wenn ja dann funzt es trotzdem net!


Aber wer weiß schon (außer dir), was du nun wieder gemacht hast? icon_wink.gif

lol
 

X-Treme

Bekanntes Mitglied
nochmal aktueller Code:

Code:
import java.util.*;
import java.io.*;

public class Words 
{
	private HashSet woerter;
	private int matchcount;
	
	public Words (String[] wort) 
	{
		matchcount = 0;
		woerter = new HashSet();
		for ( int i = 0; i < wort.length; i++) 
		{
			woerter.add(wort[i]);
		}
}
public void checkMatched(String satz) 
{
	String[] tmp = satz.split(" ");
	for ( int i = 0; i < tmp.length; i++) 
	{
		if (woerter.contains(tmp[i]))
		{
			matchcount++;
		}
	}
}
public int getMatchCount() 
{
	return matchcount;
}
public static void main (String[] args) 
{
	String[] englishArray = new String[]{"a", "is", "are", "am", "this", "I"};
	String[] germanArray = new String[]{"der", "die", "das", "ist", "dies", "Ich", "einem", "eine", "mit", "für"};
	                   
	Words english = new Words(englishArray);
	Words german = new Words(germanArray ); 
	try 
	{
	BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
	String line;
	while( (line = stdin.readLine()) != null) 
	{
		int numberGerman = german.getMatchCount();
		int numberEnglish = english.getMatchCount();  
		english.checkMatched( line);
		german.checkMatched( line);
		
	}
	}
		catch(IOException ex) 
	{
		System.out.println(ex);
	}
		if( numberEnglish > numberGerman) 
	{
		System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
	} 
		else if( numberGerman > numberEnglish) 
	{
		System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
	} 
	else 
		{
			System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
		}
	} 
}

Und nochmal aktuelle Fehler!

Words.java:57: cannot find symbol
symbol : variable numberEnglish
location: class Words
if( numberEnglish > numberGerman)
^
Words.java:57: cannot find symbol
symbol : variable numberGerman
location: class Words
if( numberEnglish > numberGerman)
^
Words.java:61: cannot find symbol
symbol : variable numberGerman
location: class Words
else if( numberGerman > numberEnglish)
^
Words.java:61: cannot find symbol
symbol : variable numberEnglish
location: class Words
else if( numberGerman > numberEnglish)
^
Note: Words.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
4 errors
 

Murray

Top Contributor
Code:
import java.util.*;
import java.io.*;

public class Words {
	private HashSet woerter;
	private int matchcount;
	
	public Words (String[] wort) {
		matchcount = 0;
		woerter = new HashSet();
		for ( int i = 0; i < wort.length; i++) {
			woerter.add(wort[i]);
		}
	}
	
	public void checkMatched(String satz) {
		String[] tmp = satz.split(" ");
		for ( int i = 0; i < tmp.length; i++) {
			if (woerter.contains(tmp[i])) {
				matchcount++;
			}
		}
	}
	
	public int getMatchCount() {
		return matchcount;
	}
	
	public static void main (String[] args) {
		String[] englishArray = new String[]{"a", "is", "are", "am", "this", "I"};
		String[] germanArray = new String[]{"der", "die", "das", "ist", "dies", "Ich", "einem", "eine", "mit", "für"};
		
		Words english = new Words(englishArray);
		Words german = new Words(germanArray );
		
		try {
			
			BufferedReader stdin = new BufferedReader(new FileReader("/home/lars/sprache.txt"));
			String line;
			while( (line = stdin.readLine()) != null) {
				english.checkMatched( line);
				german.checkMatched( line);
			}
		} catch(IOException ex) {
			System.out.println(ex);
		}
		
		int numberGerman = german.getMatchCount();
		int numberEnglish = english.getMatchCount();                   
		
		if( numberEnglish > numberGerman ) {
			System.out.println("Der Text in der Datei ist wahrscheinlich englisch");
		} else if( numberGerman > numberEnglish ) {
			System.out.println("Der Text in der Datei ist wahrscheinlich deutsch");
		} else {
			System.out.println("Der Text in der Datei ist wahrscheinlich weder deutsch noch englisch!");
		}
	}
}

So ist es übersetzbar
 

X-Treme

Bekanntes Mitglied
Jo funktioniert! Danke! kann ich die Warnung Ignorieren (hab mal gelesen, dass das was mit der Java Version zu tun hat!) Prog macht aber das richtige!

Thx for all

&

Greetz

X-Treme
 

AlArenal

Top Contributor
@x-treme:

Murray schrieb "Nee, die Reihenfolge stimmt jetzt schon (also dann, wenn die beiden ints hinter der while-Schleife dekalriert und zugewiesen werden)". Du aber hast die beiden Zeilen in die while-Schleife gepackt.
 

Murray

Top Contributor
<OT>

AlArenal hat gesagt.:
hab den Murray ganz überlesen (sorry, Matthias ;)

»Das hat dir der Teufel gesagt, das hat dir der Teufel gesagt«, schrie das Männlein, und stieß mit dem rechten Fuß vor Zorn so tief in die Erde, daß es bis an den Leib hineinfuhr, dann packte es in seiner Wut den linken Fuß mit beiden Händen, und riß sich selbst mitten entzwei.

</OT>
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben