[Pytanie - Java] T*9 - czy dobrze zrozumialem i rozwiazalem

0

Witam,
mam taki problem, na zadanie mam do napisania

Słownik podpowiedzi analogiczny do słownika T9
Celem zadania jest stworzenie programu realizującego słownik podpowiedzi analogiczny do słownika T9 używanego w wielu telefonach komórkowych przy pisaniu sms-ów. 
Na klawiaturze typowego telefonu cyfrom 2-9 odpowiadają następujące litery:
 

Użytkownik wprowadza kolejne cyfry, a program przegląda wbudowany słownik (bazę wyrazów) w poszukiwaniu wyrazu odpowiadającego ciągowi wprowadzonych cyfr. 
Przykład:
Użytkownik wprowadził: 568.
Program podpowie: kot, lot ( o ile te wyrazy są w bazie  wyrazów)
Przykładowe rozwiązanie:
•	Stworzenie listy elementów (kod cyfrowy słowa, słowo)
•	Posortowanie listy według kodów cyfrowych słów
•	Wyszukiwanie binarne tak uporządkowanej listy
Istnieją efektywniejsze rozwiązania tego zadania. 

Wybrałem 1 wersje czyli stworzenie listy elementów (kod cyfrowy słowa, słowo)

import java.util.* ;
import java.io.* ;


abstract class t99 implements Comparable<t99>{
	String slowo;
	String cyfra;
}



public class t9{
public static void main(String[] args) throws IOException{
menu();
}

public static void menu() throws IOException{
                Scanner opcja=new Scanner(System.in);
                System.out.printf("Menu:\n 1.Tlumacz\n 2.Dodaj do slownika \n 3.Wyswietl zawartosc slownika\n 4.Koniec\n");
                int i=opcja.nextInt();
                switch(i){
                        case 1: tlumacz() ; break ;
                        case 2: dodaj() ; break ;
                        case 3: wyswietl(); break;
                        case 4: break ;
                        default: System.out.printf("Nic nie wybrales!\n\n") ;
        }
}

public static void tlumacz() throws IOException{
                FileReader fr=new FileReader("slownik.txt") ;
                Scanner linia=new Scanner(fr) ;
                Scanner slowo=new Scanner(System.in) ;
                LinkedList<t99> pol=new LinkedList<t99>() ;
                LinkedList<String> ang=new LinkedList<String>() ;
                String s=new String() ;
                int l=0;
                while(linia.hasNextLine()){
                        s=linia.nextLine() ;
                        String[] polang=s.split(" ") ;
                        pol.addLast(polang[0]) ;
                        ang.addLast(polang[1]) ;
                        l++ ;
                }

                System.out.printf("Podaj wyraz: \n") ;
                s=slowo.nextLine() ;

                if(pol.indexOf(s)!=-1) System.out.printf("Tlumaczenie: "+s+" - "+ang.get(pol.indexOf(s))+"\n") ;
                if(ang.indexOf(s)!=-1)System.out.println("Tlumaczenie: "+s+" - "+pol.get(ang.indexOf(s))+"\n") ;
                if((ang.indexOf(s)==-1)&&(pol.indexOf(s)==-1))System.out.printf("Nie ma takiego slowa w slowniku!\n") ;
                System.out.printf("\n");
                menu();
}

public static void dodaj() throws IOException{
                FileWriter fw=new FileWriter("slownik.txt",true) ;
                String s=new String() ;
                Scanner slowo=new Scanner(System.in) ;
               
                System.out.printf("Slowo i Tlumaczenie: 'pol ang' \n") ;
                s=slowo.nextLine() ;
                fw.write(s+"\n") ;
                fw.close() ;
                System.out.printf("\n") ;
                menu();
        }
public static void wyswietl() throws IOException{
                FileReader fr=new FileReader("slownik.txt") ;
                Scanner linia=new Scanner(fr) ;
                while(linia.hasNextLine()){
                        System.out.println(linia.nextLine());
                                               
                }
                menu();

}
}

Chciałbym zapytać czy dobrze zrozumiałem zadanie i dlaczego nie działa on prawidłowo. Moj program dziala tak ze z pliku slownik.txt wczytuje sobie do listy slowa i ich odpowiedniki w cyfrach a nastepnie wyswietla je na ekranie w postaci "Tlumaczenie: 6262 - mama"

0

Moim zdaniem źle zrozumiałeś zadanie. Pod 800 nie ma prawa pojawić się telefon. Liczba odpowiadająca danemu słowu musi mieć tyle samo cyfr co słowo. Poczytaj jak działa T9. Np. dla liczby 2222 będzie odpowiadało słowo baba (litera 'b' jest na klawiaturze pod cyfrą 2, 'a' też). Google + T9, nie ma sensu pisać coś co już zostało napisane.

0

hej,
tzn tak wiem jak dziala t9, tylko chodzi mi czy wlasciwie zostal napisany program :) bo ... cos tu jest nie tak ale nie wiem czo :D

0
if(pol.indexOf(s)!=-1) System.out.printf("Tlumaczenie: "+s+" - "+ang.get(pol.indexOf(s))+"\n") ;
if(ang.indexOf(s)!=-1)System.out.println("Tlumaczenie: "+s+" - "+pol.get(ang.indexOf(s))+"\n") ;
if((ang.indexOf(s)==-1)&&(pol.indexOf(s)==-1))System.out.printf("Nie ma takiego slowa w slowniku!\n") ;

To w końcu T9, czy słownik polsko angielski? Pisz programy tak, aby ktoś inny, kto później do niego zajrzy mógł go zrozumieć (a już na pewno przed wrzuceniem na forum!). Nie jestem wróżką i nie wiem jak wygląda plik wejściowy.

Błąd jest zapewne we fragmencie który wkleiłem. Nie wiem, czy ang zawiera liczby, czy tłumaczenia. Ale przy założeniu, że użytkownik wprowadza liczbę, a program ma podać słowo, to bezsensem jest sprawdzanie czy liczba znajduje się w liście słów - wystarczy, że sprawdzisz, czy znajduje się w liście liczb, jeżeli tak, to wypisujesz słowo z listy słów o tym samym indeksie co liczba. Trochę zagmatwane zdanie wyszło, ale jestem padnięty.

0

Jeszcze ja. Należałoby oczywiście usunąć pierwszy lub drugi if, a zamiast trzeciego dać else.

Poza tym zadanie jest nie do końca zrobione, bo dla jednej liczby może być kilka tłumaczeń.

0

dziękuje za odpowiedź, to prawda program jest tłumaczem, przepraszam za to, bo takowy pisałem wcześniej na zasadzie, że z pliku slownik.txt, który był wypełniony 2 kolumnami, gdzie 1 kol to słowa polskie 2 kol to odpowiedniki angielskie. Chciałem ten program przerobić tak ze 1kol (pol) to po prostu cyfra a ang to jego tłumaczenie. Program nie jest dokończony bo na razie nie potrafię zrobić tak, żeby znajdowano ciąg cyfr i jego odpowiednik a następnie wyświetlenie.

0

wg. zaleceń kolegi poprawiłem kod, aby był czytlny

import java.util.* ;
import java.io.* ;


abstract class t99 implements Comparable<t99>{
String slowo;
String cyfra;
}



public class t9{
public static void main(String[] args) throws IOException{
menu();
}

public static void menu() throws IOException{
Scanner opcja=new Scanner(System.in);
System.out.printf("Menu:\n 1.Tlumacz\n 2.Dodaj do slownika \n 3.Wyswietl zawartosc slownika\n 4.Koniec\n");
int i=opcja.nextInt();
switch(i){
case 1: tlumacz() ; break ;
case 2: dodaj() ; break ;
case 3: wyswietl(); break;
case 4: break ;
default: System.out.printf("Nic nie wybrales!\n\n") ;
}
}

public static void tlumacz() throws IOException{
FileReader fr=new FileReader("slownik.txt") ;
Scanner linia=new Scanner(fr) ;
Scanner slowo=new Scanner(System.in) ;
<font color="red">LinkedList<t99> cyfra=new LinkedList<t99>() ;
LinkedList<String> tluma=new LinkedList<String>() ;
String s=new String() ;
int l=0;
while(linia.hasNextLine()){
s=linia.nextLine() ;
String[] all=s.split(" ") ;
cyfra.addLast(all[0]) ;
tlum.addLast(all[1]) ;
l++ ;
}</font>

System.out.printf("Podaj wyraz: \n") ;
s=slowo.nextLine() ;

if(cyfra.indexOf(s)!=-1) System.out.printf("Tlumaczenie: "+s+" - "+tlum.get(cyfra.indexOf(s))+"\n") ;
if(tlum.indexOf(s)!=-1)System.out.println("Tlumaczenie: "+s+" - "+cyfra.get(tlum.indexOf(s))+"\n") ;
if((tlum.indexOf(s)==-1)&&(cyfra.indexOf(s)==-1))System.out.printf("Nie ma takiego slowa w slowniku!\n") ;
System.out.printf("\n");
menu();
}

public static void dodaj() throws IOException{
FileWriter fw=new FileWriter("slownik.txt",true) ;
String s=new String() ;
Scanner slowo=new Scanner(System.in) ;

System.out.printf("Slowo i Tlumaczenie: 'Cyfra i Tlumaczenie' \n") ;
s=slowo.nextLine() ;
fw.write(s+"\n") ;
fw.close() ;
System.out.printf("\n") ;
menu();
}
public static void wyswietl() throws IOException{
FileReader fr=new FileReader("slownik.txt") ;
Scanner linia=new Scanner(fr) ;
while(linia.hasNextLine()){
System.out.println(linia.nextLine());

}
menu();

}
}

sądzę, że problem leży w czerwonym kodzie. Błagam o pomoc.

0

import java.util.*;import java.io.*;public class t9 {public static void main(String[] args) throws IOException {menu();}public static void menu() throws IOException {Scanner opcja = new Scanner(System.in);System.out.printf("Menu:\n 1.Tlumacz\n 2.Dodaj do slownika \n 3.Wyswietl zawartosc slownika\n 4.Koniec\n");int i = opcja.nextInt();switch (i) {case 1:tlumacz();break;case 2:dodaj();break;case 3:wyswietl();break;case 4:break;default:System.out.printf("Nic nie wybrales!\n\n");}}public static void tlumacz() throws IOException {FileReader fr = new FileReader("slownik.txt");Scanner linia = new Scanner(fr);Scanner slowo = new Scanner(System.in);HashMap<String, String> dict = new HashMap<String, String>();String s = null;int l = 0;while (linia.hasNextLine()) {s = linia.nextLine();String[] all = s.split(" ");dict.put(all[0], all[1]);l++;}System.out.printf("Podaj wyraz: \n");s = slowo.nextLine();if (dict.containsKey(s))System.out.printf("Tlumaczenie: " + s + " - "+ dict.get(s) + "\n");else System.out.printf("Nie ma takiego slowa w slowniku!\n");System.out.printf("\n");menu();}public static void dodaj() throws IOException {FileWriter fw = new FileWriter("slownik.txt", true);String s = new String();Scanner slowo = new Scanner(System.in);System.out.printf("Slowo i Tlumaczenie: 'Cyfra i Tlumaczenie' \n");s = slowo.nextLine();fw.write(s + "\n");fw.close();System.out.printf("\n");menu();} public static void wyswietl() throws IOException { FileReader fr = new FileReader("slownik.txt"); Scanner linia = new Scanner(fr); while (linia.hasNextLine()) {System.out.println(linia.nextLine());}menu();}}

Działa.
Plik:
2222 baba
6262 mama

0

O rany, gdyby to było choć trochę czytelne. Oto poprzedni kod, tyle że czytelniejszy

import java.util.*;
import java.io.*;
public class t9 {
    public static void main(String[] args) throws IOException {
        menu();
    }
    public static void menu() throws IOException {
        Scanner opcja = new Scanner(System.in);
        System.out.printf("Menu:\n 1.Tlumacz\n 2.Dodaj do slownika \n 3.Wyswietl zawartosc slownika\n 4.Koniec\n");
        int i = opcja.nextInt();
        switch (i) {
            case 1:tlumacz();
            break;
            case 2:dodaj();break;
            case 3:wyswietl();break;
            case 4:break;default:System.out.printf("Nic nie wybrales!\n\n");
        }
    }
    public static void tlumacz() throws IOException {
        FileReader fr = new FileReader("slownik.txt");
        Scanner linia = new Scanner(fr);
        Scanner slowo = new Scanner(System.in);
        HashMap<String, String> dict = new HashMap<String, String>();
        String s = null;
        int l = 0;
        while (linia.hasNextLine()) {
            s = linia.nextLine();
            String[] all = s.split(" ");
            dict.put(all[0], all[1]);
            l++;
        }
        System.out.printf("Podaj wyraz: \n");
        s = slowo.nextLine();
        if (dict.containsKey(s))System.out.printf("Tlumaczenie: " + s + " - "+ dict.get(s) + "\n");
        else System.out.printf("Nie ma takiego slowa w slowniku!\n");
        System.out.printf("\n");
        menu();
    }
    public static void dodaj() throws IOException {
        FileWriter fw = new FileWriter("slownik.txt", true);
        String s = new String();
        Scanner slowo = new Scanner(System.in);
        System.out.printf("Slowo i Tlumaczenie: 'Cyfra i Tlumaczenie' \n");
        s = slowo.nextLine();
        fw.write(s + "\n");
        fw.close();
        System.out.printf("\n");
        menu();
    }
    public static void wyswietl() throws IOException { 
        FileReader fr = new FileReader("slownik.txt");
        Scanner linia = new Scanner(fr); 
        while (linia.hasNextLine()) {
            System.out.println(linia.nextLine());
        }
        menu();
    }
}
0

dziekuję bardzo za odpowiedź [browar]

chciałbym jeszcze tylko(to już naprawdę ostania rzecz) jak zmusić hashmapę, żeby przeszła po całym słowniki i wyświetliła wszystkie możliwości tzn 568 - kot lot? Bo jak na razie po znalezieniu 1 dobrego elementu Od razu zatrzymuje się.

PS. dodalem do kodu dodawanie slow w przypadku ich braku

import java.util.*;
import java.io.*;
public class t9 {
	public static void main(String[] args) throws IOException {
	menu();
}
	
	public static void menu() throws IOException {
		Scanner opcja = new Scanner(System.in);
		System.out.printf("Menu:\n 1.Tlumacz\n 2.Dodaj do slownika \n 3.Wyswietl zawartosc slownika\n 4.Koniec\n");
		int i = opcja.nextInt();
		switch (i) {
			case 1:tlumacz();break;
			//case 2:dodaj();break;
			case 3:wyswietl();break;
			case 4:break;
			default:System.out.printf("Nic nie wybrales!\n\n");
			}
			}public static void tlumacz() throws IOException{
				FileReader fr = new FileReader("slownik.txt");
				Scanner linia = new Scanner(fr);
				Scanner slowo = new Scanner(System.in);
				HashMap<String, String> dict = new HashMap<String, String>();
				String s = null;
				int l = 0;
				while (linia.hasNextLine()){
					s = linia.nextLine();
					String[] all = s.split(" ");
					dict.put(all[0], all[1]);
				l++;
				}
				System.out.printf("Podaj ciag znakow: \n");
				s = slowo.nextLine();
				if (dict.containsKey(s))
				System.out.printf("Tlumaczenie: " + s + " - "+ dict.get(s) + "\n");
				else {System.out.printf("Nie ma takiego slowa w slowniku!\n");
						System.out.printf("Czy chcesz dodac do slowanika? [Tak-1|Nie-2]");
						Scanner op = new Scanner(System.in);
						int j = op.nextInt();
							switch (j) {
								case 1:dodaj(s,s);break;
								case 2:menu();break;
								default: break;
										}
				}
								System.out.printf("\n");
				menu();
				}
				
				
		public static void dodaj(String s, String sl) throws IOException{
					FileWriter fw = new FileWriter("slownik.txt", true);
					Scanner slowo = new Scanner(System.in);
					System.out.printf("Podaj tlumaczenie dla ciagu znakow: "+s+"\n");
					sl = slowo.nextLine();
					fw.write(s+" "+sl+"\n");
					fw.close();System.out.printf("\n");
					menu();
					} 
					
					
					
		public static void wyswietl() throws IOException { 
				FileReader fr = new FileReader("slownik.txt");
				Scanner linia = new Scanner(fr);
				while (linia.hasNextLine()){
				System.out.println(linia.nextLine());
				}
				menu();
		}
}

Bo nie wiem czy jakis for wystarczy, żeby zmusić tę hashmapę do przelecenia całego pliku, bo tam przy dodawaniu do listy zrobilem sobie licznik l wiec petla for moglbym jakos wymusic zeby przelecial przez cala petle).

Pozdrawiam.

0

W Hashmapie może być więcej niz jedna możliwość?

0

proszę, nie mów, że nie ...

0

Nie spełnię Twojej prośby i powiem: nie może.

dict.put("a","babcia");
dict.put("a","dziadek"); //zastępuje poprzedni wpis i wymazuje babcię

//Edit Spróbuj zmienić typ słownika na HashMap<String,String[]> lub HashMap<String,ArrayList<String>>.

0

w takim razie jakie jest inne rozwiązanie tego problemu?? na pewno da się go jakość obejść...

//Edit zmiana nie pomaga ;(

0

A co zmieniłeś w programie?
Jeżeli dict jest typu HashMap<strin,ArrayList<String>>, to dopisanie pary (key,wartosc) winno wyglądać tak:

if(!dict.containsKey(key))
   dict.put(key,new ArrayList<String>());
dict.get(key).add(wartosc);

1 użytkowników online, w tym zalogowanych: 0, gości: 1