Maszyna Zimmermana - projekt znaleziony w sieci

0

Witam wszystkich. Dopiero uczę się JAVY i mam dość duży problem. Mianowicie, znalazłem w sieci projekt tzn zadanie do wykonania w JAVIE ale nie wiem za bardzo jak mam się za to zabrać. Próbowałem to napisać ale za nic w świecie mi to nie wychodzi. Zadanie nie wydaje się być ciężkie ale mnie przerosło. Mianowicie mam plik z najczęściej używanymi słowami w języku angielskim. Przy użyciu Hash Maps muszę wygenerować 5 cyfrowe liczby które będą reprezentowały poszczególne wyrazy z pliku tekstowego który będzie je zawierał. Następnie po wpisaniu jakiegoś tekstu, program powinien odczytać wartości key lub value z map w zależności czy będziemy kodować tekst czy go dekodować. Przy dekodowaniu program powinien znaleźć poszczególne słowo w Hash Mapie i zareprezentować je z wartości Value jako liczbę, żeby było to słowo zakodowane. Następnie zapisane to wszystko do innego pliku. Mój problem polega na tym, że niemogę sobie poradzić z Hash Mapami :/ Czy mógłby mi ktoś podpowiedzieć jak można to zrobić?

W wersji roboczej chciałem zrobić to tak :/

import java.util.*;
import java.io.*;
public class HashMaps {
    //static HashMap<String, Boolean> map = new HashMap<>();
    public static void main(String args[]) throws IOException {

        PrintWriter output = new PrintWriter("random.txt");
        final int randomNumberCount = 5;

        Random randomGenerator = new Random();
        for(int i= randomNumberCount; i>=0; i--) {
            output.println(randomGenerator.nextInt(30_000) + " ");
        }

        output.close();

        Map<String, Integer> map = new HashMap<String, Integer>();
        BufferedReader in = new BufferedReader(new FileReader("dic.txt"));
        Scanner num = new Scanner(new File("random.txt"));

        String line = "";

        int i = 0;
        while((line = in.readLine()) != null && num.hasNextInt()) {
            int[] tall = new int[5];

            tall[i++] = num.nextInt();
            String name[] = line.split("\t");

            map.put(name[0], Integer.valueOf(tall[1]));

        }

        in.close();
        num.close();

    }
}

Problem polega na tym iż generowane liczby z pliku nie są osadzone do HashMapy :(

Drugi problem polega na tym za baqrdzo nie wiem jak się zabrać za utworzenie metody do wyszukiwania w HashMapie, czy wystarczy szukać według Key i Value?

1

Ale co tu chcesz robić niby?

        Map<String, Integer> codeMap = new HashMap<>();
        codeMap.put("Ala", 1);
        codeMap.put("Ola", 2);
        Map<Integer, String> decodeMap = codeMap.entrySet().stream().
                collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
        String input = "Ala Ola";
        String encoded = Arrays.asList(input.split(" ")).stream().
                map(codeMap::get).
                map(Object::toString).
                collect(Collectors.joining(" "));
        System.out.println(encoded);
        String decoded = Arrays.asList(encoded.split(" ")).stream().
                map(Integer::parseInt).
                map(decodeMap::get).
                collect(Collectors.joining(" "));
        System.out.println(decoded);

I voila. Cały kod kodowania i dekodowania. Teraz tylko musisz sobie tą mapę encodeMap zrobić i już.

0

Dzięki wielkie :) , mniej więcej o to mi chodziło :) Problem polega na tym, że do HashMapy do wartości Key muszę wczytać słowa z pliku tekstowego. Do wartości value muszę wczytać liczby 5 cyfrowe, które też muszą być zapisane w pliku txt i muszą być one wygenerowane...

1

Ach no i gdzie problem?

        Map<String, Integer> codeMap = new HashMap<>();
        AtomicInteger counter = new AtomicInteger(10000);
        Files.readAllLines(Paths.get("test.txt")).parallelStream().
                flatMap(line -> Arrays.stream(line.split(" "))).
                map(String::toLowerCase).
                filter(word -> !codeMap.containsKey(word)).
                forEach(word -> codeMap.put(word, counter.getAndIncrement()));

I voila, mamy mapę która dla każdego słowa z "test.txt" przyporządkowuje liczbę pięciocyfrową :P
Jeśli chcesz żeby to nie były takie kolejne liczby tylko chcesz je brać z innego miejsca, to po prostu zmień tą jedną linijkę w kodzie na liczby z jakiejś listy.

0

Dzięki wielkie. Ogarne to jakoś :) postaram się nidzie nie utknąć :)

0

Po wpisaniu Twojego kodu mam problem z uruchomieniem aplikacji...

Map<String,Integer> codeMap = new HashMap<>();
        codeMap.put("Ala", 1);
        codeMap.put("Ola", 2);
        Map<Integer, String> decodeMap = codeMap.entrySet().stream().
                collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey()));
        String input = "Ala Ola";

        String encoded = Arrays.asList(input.split(" ")).stream().
                map(codeMap::get).
                map(Object::toString).
                collect(Collectors.joining(" "));

        System.out.println(encoded);
        String decoded = Arrays.asList(encoded.split(" ")).stream().
                map(Integer::parseInt).
                map(decodedMap::get).
                collect(Collectors.joining(" "));

        System.out.println(decoded);

Pojawia mi się komunikat:

xception in thread "main" java.lang.Error: Unresolved compilation problems: 
    Map.Entry cannot be resolved to a variable
    Syntax error on tokens, delete these tokens
    The method Entry() is undefined for the type Map
    Syntax error on tokens, delete these tokens
    The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments (Map<String,Integer>)
    Syntax error on tokens, delete these tokens
    Object cannot be resolved to a variable
    Syntax error on tokens, delete these tokens
    Integer cannot be resolved to a variable
    Syntax error on tokens, delete these tokens
    decodedMap cannot be resolved to a variable
    Syntax error on tokens, delete these tokens

    at HashMaps.main(HashMaps.java:61)
0
  1. Jaka java? Kod wymaga 1.8
  2. Zaimportowałeś wszystko co potrzebne?
0

Tak właśnie myślałem - zaraz zainstaluje JDK8 :) Dzięki...

Jednak czegoś chyba nie zapimportowałem :/ Wystarczy import java.util.* czy jeszcze coś musze dodać?

0

Wystarczy ze użyjesz IntelliJ albo od biedy Eclipse i samo ci zaimportuje / podpowie co zaimportować...
JDK8 to nie jest żaden dodatek. Warto uczyć sie wersji aktualnej. Akurat Stream API to jest szczegół, ale bardzo elegancki i wygodny. Nie ma sensu się go nie uczyć. To tak jakbyś pytał czy warto uczyć sie jeździć Fiatem 125p a dopiero potem martwić się dodatkami jak czujniki parkowania czy wspomaganie kierownicy. Można i tak, tylko nie bardzo widzę sens. Te nowe dodatkowe funkcjonalności są po to żeby ci było łatwiej a nie trudniej ;)

0

Dzięki za odpowiedź... Dalej wyrzuca mi jakieś dziwne błędy. Zaimportowałem biblioteke util tak samo jak i stream z collectors ale dalej wyrzuca jakieś dziwne błędy. Poboeram właśnie IntelliJ zobaczymy co tam pokaże ;)

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