napisy/zapis do pliku - optymalizacja kodu

0

Czy zmienilibyście coś w tym kodzie na "lepsze" ??

package napisy;

/*
Zbiór Zadan 7
Zad 4
 Pobieraj od użytkownika napis, dopóki na pozycjach parzystych nie będą występowały znaki o parzystych kodach ASCII,
 a na pozycjach nieparzystych znaki o nieparzystych kodach ASCII. Napis musi również posiadać parzystą ilość znaków.
 Następnie zastosuj proste szyfrowanie napisu, które zamieni dwa sąsiadujące ze sobą znaki miejscami.
 Otrzymany zaszyfrowany napis zapisz do pliku tekstowego o nazwie napisy_zad5.
 */

import javax.print.DocFlavor;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;

public class Zad5 {

    static String getString() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Podaj napis. Na parzystym indeksie parzysty koD ASCII na nieparzystym odwrotnie. Parzysta liczba znakow");
        String string = sc.nextLine();

        if (!checkString(string) || !(string.length() % 2 == 0)) {
            throw new IllegalArgumentException("String is not correct");
        }
        return string;

    }

    static boolean checkString(String string) {

        if(string == null){
            throw new IllegalArgumentException("String is null");
        }

        char[] charArray = string.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            if (i % 2 == 0) {
                //na indeksach parzystych powinny być ASCII parzyste
                if (evenASCII(charArray[i])) {

                } else
                    return false;
            } else {
                //na indeksach nieparzystych powinny być ASCII nieparzyste
                if (evenASCII(charArray[i])) {
                    return false;
                }
            }
        }
        return true;
    }


    static boolean evenASCII(char letter) {

        int decLetter = letter;

        if (decLetter % 2 == 0) {
            return true;
        } else return false;

    }


    static String encryption2(String string) {

        if(string == null){
            throw new IllegalArgumentException("String is null");
        }

        char[] charArr = string.toCharArray();
        char temp;

        for (int i = 0; i < charArr.length - 1; i++) {
            if (i % 2 == 0) {
                temp = charArr[i];
                charArr[i] = charArr[i + 1];
                charArr[i + 1] = temp;
            }
        }
        return new String(charArr);
    }


    static void fileWriter(String string) {

        if(string == null){
            throw new IllegalArgumentException("string is null");
        }

        try (
                FileWriter fileWriter = new FileWriter("napisy_Zad5");
                PrintWriter printWriter = new PrintWriter(fileWriter)) {

            printWriter.println(string);

        } catch (Exception e) {
            throw new IllegalArgumentException("sgfdfg");
        }

    }

    public static void main(String[] args) {
        String string = getString();
        String encryptedString = encryption2(string);
        fileWriter(encryptedString);
    }
}

1
  • zastanów się czy wszystko musi być static
  • zastanów się czy wszystko powinno mieć taki modyfikator dostępu
for (int i = 0; i < charArray.length; i++) {
            if (i % 2 == 0) {
                //na indeksach parzystych powinny być ASCII parzyste
                if (evenASCII(charArray[i])) {

                } else
                    return false;
            } else {
                //na indeksach nieparzystych powinny być ASCII nieparzyste
                if (evenASCII(charArray[i])) {
                    return false;
                }
            }
        }
        return true;

wygląda co najmniej brzydko, przeanalizuj czy blok else w pierwszym przypadku jest Ci potrzebny (podpowiedź - negacja). Nawet więcej, czy potrzebny jest Ci ten if skoro zwracasz booleana
*

    static void fileWriter(String string) {

        if(string == null){
            throw new IllegalArgumentException("string is null");
        }

        try (
                FileWriter fileWriter = new FileWriter("napisy_Zad5");
                PrintWriter printWriter = new PrintWriter(fileWriter)) {

            printWriter.println(string);

        } catch (Exception e) {
            throw new IllegalArgumentException("sgfdfg");
        }

    }

Dlaczego łapiesz ogólny Exception?
*

if (decLetter % 2 == 0) {
            return true;
        } else return false;

nie łatwiej return decLetter % 2 == 0 ?

  • uważaj z tym Scannerem bo otworzyć i zamknąć możesz go tylko raz, dwukrotne wywołanie metody = dużo zdziwień i nieprzyjemności (jest dużo o tym w necie)

To tyle tak na szybko bo mam jutro arcy-egzamin do zdania, powodzonka

0

Zrobiłem static żeby nie musieć tworzyć obiektu klasy celem użycia metody. Szczerze to kwestię modyfikatorów mam zaplanowaną na niedaleką przyszłość. Poniżej poprawiona metoda o której wspomniałeś

    static boolean checkString(String string) {

        if (string == null) {
            throw new IllegalArgumentException("String is null");
        }

        char[] charArray = string.toCharArray();
        boolean flaga = true;

        for (int i = 0; i < charArray.length; i++) {

            if (i % 2 == 0) {
                flaga = evenASCII(charArray[i]);
            } else {
                flaga = !evenASCII(charArray[i]);
            }
        }
        return flaga;
    }

Jeśli chodzi o łapanie wyjątków to do tego również mamy wrócić w przyszłości (ja i mój mentor) Na razie powiedział tylko tyle, że jest to jego sposób na wyjątki z którym nie trzeba się zgadzać. Na razie nie skupiamy się na tym.

Kolejna poprawiona metoda

    static boolean evenASCII(char letter) {

        int decLetter = letter;
        return decLetter % 2 == 0;
    }

Dzięki za rady :)

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