Come interpretare una command line

di il
3 risposte

Come interpretare una command line

Ciao a tutti,
Ho iniziato a programmare da 2-3 settimane circa e nel mio corso ho avuto questo compito da fare.
Praticamente devo creare un programma che dati un file input e un file con un dizionario, trovi tutti gli anagrammi possibili.
Come compito per una valutazione superiore devo dividere il programma nella possibilita' di trovare anagrammi completi e parziali grazie ad una linea di comando (per esempio "se premi 1 anagrammi completi", "se premi 2 anagrammi parziali").

Ecco il codice:
package com.company;

import java.io.File;
import java.io.PrintWriter;
import java.util.*;

public class Main {

    public static final String NEW_LINE = "\n";

    public static void main(String[] args) {
        start.start();
        String inputFile = "smaple-anagram-input.txt";
        String dictionaryFile = "dictionary.txt";
        String outFile = "output.txt";
        boolean includePartials = true;
  


        // Check for input
        if (args.length >= 3) {
            inputFile = args[0];
            dictionaryFile = args[1];
            outFile = args[2];
            if (args.length>=4) {
                includePartials = Boolean.valueOf(args[3]);
            }
        } else {
            System.out.println("Using default parameters");
        }


        // read paragraph txt file into list of words
        List<String> paragraph = readFileToWords(inputFile, true);
        // read dictionary into list of words
        List<String> dictionary = readFileToWords(dictionaryFile, false);

        // for each word in paragraph, find anagram in dictionary
        List<String> newParagraph = new ArrayList<>();
        int replacedWords = 0;
        for (String word : paragraph){
            String anagram =  findAnagram(word,dictionary);

            // replace word with anagram and print to console
            // remove special characters from word
            if (null == anagram || anagram.equalsIgnoreCase(trimNonAlphaCharacters(word)) ) {
                newParagraph.add(word);
            }  else {
                if (anagram.length() == trimNonAlphaCharacters(word).length()){
                    System.out.println(trimNonAlphaCharacters(word) + " replaced with full anagram " + anagram);
                    replacedWords++;
                    newParagraph.add(word.toLowerCase().replace(trimNonAlphaCharacters(word),anagram));
                } else {
                    if (includePartials) {
                        System.out.println(trimNonAlphaCharacters(word) + " replaced with partial anagram " + anagram);
                        replacedWords++;
                        newParagraph.add(word.toLowerCase().replace(trimNonAlphaCharacters(word), anagram));
                    } else {
                        newParagraph.add(word);
                    }
                }

            }
        }

        // write new paragraph to file
        try {
            File myFile = new File (outFile);
            PrintWriter myOutput = new PrintWriter(myFile);

            for(String newWord : newParagraph) {
                if (newWord.equals("NEW_LINE")) {
                    myOutput.println();
                } else {
                    myOutput.print(newWord + " ");
                }
            }//end for

            myOutput.close();
        } catch (Exception e) { //end try/beginning of catch
            System.out.println("FILE DRAMA");
        } //end catch

        // print statistics
        float percentage = (Float.valueOf(replacedWords)/paragraph.size())*100;
        System.out.println("Statistics: " + percentage + "% words replace with anagrams");

    }
    


    private static String trimNonAlphaCharacters(String input){
        return input.toLowerCase().replaceAll("[^a-z]", "");
    }

    private static String findAnagram(String word, List<String> dictionary) {

        String anagram = null;

        Map<Character, Integer> wordMap = getWordMap(word);


        for (String dictionaryWord : dictionary) {
            Map<Character, Integer> dictionaryWordMap = getWordMap(dictionaryWord);
            boolean matched = true;
            for(Map.Entry characterEntry : dictionaryWordMap.entrySet()){
                // for each character in the dictionary word, check if it is in the paragraph word
                // and confirm that it is in the same number of times
                if (!(wordMap.containsKey(characterEntry.getKey())
                        && wordMap.get(characterEntry.getKey()).equals(characterEntry.getValue()))){
                    matched = false;
                    break;
                }
            }
            if (matched == true)
            {
                // find the longest anagram
                if (anagram == null || dictionaryWord.length() > anagram.length()) {
                    anagram = dictionaryWord;
                }
            }

        }

        return anagram;
    }

    private static Map<Character, Integer> getWordMap(String word) {
        Map<Character, Integer> wordMap = new HashMap<>();
        // turn word into map
        for(char character : word.toLowerCase().toCharArray()){
            if (wordMap.containsKey(character)){
                wordMap.put(character,wordMap.get(character) + 1);
            } else {
                wordMap.put(character, 1);
            }
        }
        return wordMap;
    }

    private static List<String> readFileToWords (String fileName, boolean includeNewLines) {

        List<String> words = new ArrayList<>();
        // get file
        try {
            File myFile = new File (fileName);
            Scanner myInput = new Scanner(myFile);

            while (myInput.hasNextLine()) {
                // get each line
                String line = myInput.nextLine();
                // for each line split into words
                // add all words to response
                words.addAll(Arrays.asList(line.split(" ")));
                if (includeNewLines) {
                    words.add(NEW_LINE);
                }

            } //end of while

        } catch (Exception e) { //end of try/beginning of catch
            System.out.println("Something went horribly wrong!");
        } //end of catch
        return words;

    }//end readFileToWords
    public static void keyTyped(KeyEvent e) {
        char keyChar = e.getKeyChar();
        if (keyChar == '1'){
            boolean =false;
    }else if (keyChar == '2') {
        boolean =true;
        }
    }
    } // end of class


START CLASS

package com.company;


import java.util.Scanner;

public class start {

    public static void start() {
        Scanner initial = new Scanner(System.in);

        System.out.println("Welcome to the Anagram Solver!");

        System.out.println("This program will create an anagram for each" +
                "\nword of a given text file." +
                "\nYou will also get a percentage of the words anagramised!");

        while (true) {
            System.out.println("Press 1 to start the full anagram mode." +
                    "\nPress 2 to start the partial anagram mode." +
                    "\nPress R to restart");
            if (initial.next().equals("1")) {
                break;
            }
            if (initial.next().equals("2")){
            break;
        }
        if (initial.next().equals("r") {
            start();

            }else{
                System.out.println("Invalid entry try again");


            }
        }
    }
}
Grazie in anticipo

p.s. = si, i miei trainer stanno fuori di testa XD

3 Risposte

  • Re: Come interpretare una command line

    Titolo del thread errato: le command line NON SI CREANO, al piu' si INTERPRETANO.
    E comunque lo hai gia' fatto tu, la creazione della command line, intendo.
    Noi che centriamo?

    p.p.s. = i tuoi trainer NON STANNO fuori di testa XD. Sei TU che non hai studiato!

    p.p.p.s. = non ci crede nessuno che quel codice e' stato scritto da te! Non siamo tonti fino a questo punto
  • Re: Come interpretare una command line

    Non pensavo di essere frainteso per una battuta.
    Come ho accennato all'inizio ho iniziato da poco, per la precisione sto facendo un apprendistato in inghilterra per conto di una compagnia.
    Il codice non e' stato completamente scritto da me (non ne ho scritto neanche meta' giusto per evitare ulteriori fraintendimenti) poiche' in 2 settimane dubito qualcuno riesca a fare una cosa simile (abbiamo grossi problemi col college e il metodo di insegnamento in questo senso).
    Io e altri miei colleghi siamo stati aiutati da Chief Engineer della nostra compagnia a compilare e cercare di capirci qualcosa (Ci faranno altri training una volta completato questo corso presso la compagnia dato che sono consapevoli delle grosse lacune del college).
    Il mio "gergo" e' quello di un bambino di prima elementare poiche' come gia' detto sono completamente nuovo a tutto cio'.
    Il mio problema e' che non riesco a implementare il fatto di premere un tasto con la selezione che effettuo nella classe start.
    Se questo deve essere motivo di litigio o di offesa, mi spiace ma non sono qui per questo.
    Grazie in ogni caso a chiunque volesse/potesse darmi una mano.
  • Re: Come interpretare una command line

    Non e' per litigare, ci mancherebbe, ma la questione e' molto piu' semplice: NON SI IMPARA A PROGRAMMARE IN QUALCHE SETTIMANA!

    Non esiste!
    E chi lo fa credere e' solo un truffatore.

    Questi corsi, di qualche settimana, sono utili SOLO a chi SA GIA' PROGRAMMARE in qualche altro linguaggio di programmazione (C/C++/C#/Python/Ruby/PHP/Erlang/Haskell/Lisp/Prolog/Miranda/Pascal/Modula/Oberon/Forth/Fortran/... https://en.wikipedia.org/wiki/List_of_programming_languages) e deve convertirsi in Java. Per questi, il corso e' assolutamente valido.

    Per gli altri, mi dispiace dirlo, ma sara' la strage degli innocenti

    E questo NON E' per non risponderti, ma semplicemente perche' per realizzare quello che hai indicato, a ME, che sono programmatore esperto, con N-mila anni di esperienza, mi ci vuole un'oretta (e probabilmento sottostimo pure).

    Ti spiego:

    - c'e' da leggere DUE file, per quanto semplici, bisogna conoscere la libreria per la lettura/scrittura di file di testo in Java
    - bisogna sapere che cosa e' un dizionario
    - bisogna conoscere i metodi per la manipolazione id stringhe
    - sapere che cosa e' un anagramma
    - saper come si INVERTE una stringa e come si spezza una stringa,
    - sapere che cosa fare se la stringa ha lunghezza pari/dispari oppure e' lunga ZERO
    - bisogna sapere che cosa e' un 'anagrtamma completo',
    - bisogna sapere come gestiore lo standard input, lo standard outpu, lo standard error, e come leggere i tasti da tastiera

    Anche se SINGOLARMENTE le cose si sanno, metterle tutte assieme per fare quello che e' richiesto richiede COMUNQUE del tempo.

    Tu dirai: ma il tempo che hai dedicato a rispondere lo potevi dedicare a scrivere il programma per ME.

    Ovviamente NON FUNZIONA: il tempo che ho dedicato a rispondere l'ho tolto allo studio delle MIE cose!
Devi accedere o registrarti per scrivere nel forum
3 risposte