Czyszczenie konsoli + ocena kodu

0

Witajcie,
napisałem właśnie mój pierwszy taki w pełni obiektowy program. Prosiłbym Was o ocenę - zastosowanych rozwiązań (może coś byłoby lepiej zrobić inaczej) jak i samej obiektowości (dobrze rozumiem jej idee?). Mam również pytanie. W jaki sposób mogę wyczyścić konsole? runtime.getruntime().exec("cls"); jakoś nie chce zadziałać.
http://4programmers.net/Pastebin/4902

Wszystkim serdecznie dziękuję za rady i poświęcony czas :)
Pozdrawiam!

0

Ktoś coś? :)

0

Runtime.getRuntime().exec("cls"); nie zadziała, bo nie istnieje program o nazwie cls.
Program wygląda nieźle, ale pętla

       
do {
            word.add(i, new Word());
            line = scanner.nextLine();
            part = line.split(";");
            word.get(i).setEng(part[0]);
            word.get(i).setPl(part[1]);
            i++;
        } while (scanner.hasNextLine());

jest niedobra. Wysypie program gdy plik jest pusty (mniej groźne) i gdy plik zawiera błędny wiersz (bez średnika). Lepiej pominąć wiersz niż wysypywać program.

0

Zgodnie ze wskazówką @_13th_Dragon wklejam kod tutaj :)

public class Word {
    String eng, pl;

    public void setEng(String eng) {
        this.eng = eng;
    }

    public void setPl(String pl) {
        this.pl = pl;
    }

    public String getEng() {
        return eng;
    }

    public String getPl() {
        return pl;
    }
}

public class Manage {

    List<Word> word = new ArrayList<Word>();
    int size;
    List<Integer> correct = new ArrayList<Integer>();
    int place;


    public void loadWord(String name) throws FileNotFoundException {
        File file = new File(name);
        Scanner scanner = new Scanner(file);
        int i = 0;
        String line;
        String[] part;
        while (scanner.hasNextLine()) {
            word.add(i, new Word());
            line = scanner.nextLine();
            part = line.split(";");
            word.get(i).setEng(part[0]);
            word.get(i).setPl(part[1]);
            i++;
        }
        scanner.close();
        size = word.size();
        random();
    }

    private void random() {
        Random rand = new Random();
        place = rand.nextInt(size);
        for (int i = 0; i < correct.size(); i++) {
            if (place == correct.get(i))
                random();
        }
    }

    public String getPl() {
        return word.get(place).getPl();
    }

    public boolean check(String txt) {
        if (txt.equals(word.get(place).getEng())) {
            correct.add(place);
            random();
            return true;
        }
        else {
            random();
            return false;
        }
    }

}

public class Slowka {

    static Manage manage = new Manage();

    private static void load(String txt) {
        try {
            manage.loadWord(txt + ".txt");
        } catch(FileNotFoundException e) {
            System.out.println("Nie znaleziono pliku!");
        }
    }

    public static void main(String[] args) throws IOException {
        String word;
        Scanner scanner = new Scanner(System.in);
        System.out.println("Podaj nazwe pliku ze slowkami");
        load(scanner.nextLine());
        do {
            System.out.println(manage.getPl());
            word = scanner.nextLine();
            if (manage.check(word))
                System.out.println("\n\nBrawo!\n\n");
            else
                System.out.println("\n\nBuuu...\n\n");
        } while (manage.correct.size() != manage.size);
        scanner.close();
    }
}

@bogdans dziękuję ci za wskazówkę! Zmieniłem do...while na while, przez co załatwiłem problem pustego pliku. Jednak nie mam pomysłu jak najlepiej sprawdzać średnik. Jedyne co przychodzi mi do głowy to sprawdzanie w pętli całej linii i szukanie ';'.

Dziękuję wszystkim za uwagi i poświęcony czas! :D
Pozdrawiam.

0

Ja bym dopisał konstruktor do klasy Word

public class Word {
    String eng, pl;
    public Word(String eng, String pl)
    {
         this.eng = eng;
         this.pl = pl;
    }
    public void setEng(String eng) {
        this.eng = eng;
    }
...

settery wydają się być zbyteczne. Zmienna i w pętli dopisującej jest zbędna.

        while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            part = line.split(";");
            if(part.length >= 2)
            {
                 word.add(new Word(part[0],part[1]));
            }
        }
0
  1. Mimo że w javie to nie ma takich drastycznych efektów jak w C to nieuzasadniona postinkrementacja zawsze ma lekki smrodek: http://4programmers.net/Forum/1101404
  2. Po kiego ci składowa size chcesz ryzykować stanu gdzie size!=word.size()?
  3. void random() zrealizowana rekurencyjnie!! co za wybitny pomysł?! Zastanów się nad tym: http://stackoverflow.com/questions/1519736/random-shuffling-of-an-array
  4. Zapoznaj się z tym: http://www.tutorialspoint.com/java/java_dictionary_class.htm to bardziej odpowiada twoim potrzebom
  5. Warto przemyśleć kilka znaczeń słowa czyli do dictionary przyda się http://beginnersbook.com/2013/12/hashset-class-in-java-with-example/

Może aby zobrazować: http://ideone.com/kIl1Fq

import java.util.HashSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

class Ideone
{
	public static void main (String[] args)
	{
      Vocabulary v=new Vocabulary();
      v.put("one","jeden");
      v.put("one","jedyny");
      v.display();
      v.invert();
      v.display();
      v.invert();
      v.display();
	}
}

class Vocabulary
  {
   private HashMap<String,HashSet<String>> map=new HashMap<String,HashSet<String>>();
   public void put(String src,String dst)
     {
      HashSet<String> tmp=map.get(src);
      if(tmp==null) 
        {
         tmp=new HashSet<String>();
         map.put(src,tmp);
        }
      tmp.add(dst);
     }
   public void display()
     {
      for(Map.Entry<String,HashSet<String>> mr:map.entrySet())
        {
         System.out.print(mr.getKey()+":");
         for(String value:mr.getValue()) System.out.print(" "+value);
         System.out.println();
        }
      System.out.println();
     }
   public void invert()
     {
      Vocabulary v=new Vocabulary();
      for(Map.Entry<String,HashSet<String>> mr:map.entrySet())
        {
         String key=mr.getKey();
         for(String value:mr.getValue()) v.put(value,key);
        }
      map=v.map;
     }
  }

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