Jak napisać własną klasę String w oparciu o tablice Char?

0

Cześć wszystkim,

Mam poważny problem w moim życiu i w dążeniu do bycia programistą. Skończyłem kurs, wiele nauki i pierwszy staż jako dev. I wszystko szło dobrze dopóki mogłem korzystać z gotowego programu i go poprawiać aż do momentu kiedy mój opiekun chciał mnie sprawdzić tak ogólnie i wyszło na to, że nie umiem od 0 napisać własnego kodu.
Dostałem takie zadanie:

Napisz program, w którym zaimplementujesz własną klasę String w oparciu o tablicę znaków. Niech klasa ta nazywa się ChrStr. Niech ChrStr wystawia następujące publiczne API:
ChrStr()
ChrStr(String input)
length() - długość łańcucha znaków
trim() - obcięcie spacji z początku i z końca
append(char) - dostawienie znaku na końcu
insert(index,char) - wstawienie znaku w dowolną pozycję index łańcucha. Jeśli index przekracza length, to brakujące znaki uzupełnić spacjami.
Przykład:
'ala ma kota'
insert(15,'z')
'ala ma kota z'
toString() - wyświetla zawartość naszej klasy na standardowym wyjściu

Oto mój kod (tak wiem, że bieda :/ )

package org.example;

public class ChrStr {

    int size = 1000;
    char array[] = new char[size];

    public ChrStr(){

    }

    public ChrStr(char[] array){
        this.array = array;
    }

    public ChrStr(String input){
        if (input == null ){
            throw new IllegalArgumentException("this is not String");
        } else {
            for (int i = 0; i< array.length; i++){
                System.out.println(array[i]);
            }
        }
    }
    public ChrStr lenghtBebechy(){
        return null;
    }
    public ChrStr trimBebechy(){
        return null;
    }
    public ChrStr appendBebechy(char sign){
        return null;
    }
    public ChrStr insertBebechy(int index,char sign){
        return null;
    }
    //pokazuje mi, że tu ma być String ale muszę tu użyć swojej klasy chyba tak ?
    public ChrStr toString(){
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");

        String nazwa = "nazwa";

        nazwa.length();
        nazwa.trim();

        char sign = '!';

        StringBuilder nazwa1 = new StringBuilder().append("c").insert(1,1);
        System.out.println(nazwa1);

        ChrStr chrStr = new ChrStr("name");
        System.out.println(chrStr);
    }

}

Umiem używać gotowców znam te komendy i zdaje mi się, że rozumiem ich działanie ale zdaniem mojego opiekuna i co jest prawdą nie umiem myśleć jak maszyna i to jest mój problem. Dlatego nie mogę stworzyć nic od zupełnego zera.

Nie wiem czy rozwiązanie przez kogoś coś mi da.
Być może ktoś będzie miał chęci mi to jakoś wytłumaczyć albo powiedzieć co mogę w sobie zmienić żeby się przełamać. Bardzo chce programować i muszę walczyć ale sam już nie daje rady, dlatego potrzebuje dobrego ducha który mi poradzi jak sobie z tą barierą poradzić.

Za wszelaką pomoc z góry dziękuje .

2

@Tomasz J:

Fajne studenckie zadanie, nie robi krzywdy ... na godzinę (gdybym Cię miał zatrudniać, wymagałbym godziny ... no moze kosmetyczny margines litości, ale nie x2)
To tak mówię, bo czasem zadania są totalnie głupie, antydydaktyczne, to jest fajne i uczciwe ... *)

   //pokazuje mi, że tu ma być String ale muszę tu użyć swojej klasy chyba tak ?
    public ChrStr toString(){
        return null;
    }

Chyba mimo zadania, warto by mieć choć jeden punkt wspólny z fabrycznym Stringiem, choćby po to, aby do wydrukować. Metoda toString jest standardową w Object, wiec każda klasa javowska chce czy nie, musi go mieć

   @Override
    public String toString(){
      ... 
    }

*) a że w ścieżce coś nie pykło ...
Metody nie zaimplementowane, to z czym właściwie do nas przychodzisz ... konstruktory bardzo chropowate ...

0
ZrobieDobrze napisał(a):

@Tomasz J:

Chyba mimo zadania, warto by miec choć jeden punkt wspólny z fabrycznym stringiem, choćby po to, aby do wydrukować. toString jest standardową metodą w Object, wiec każda klasa javowska chce czy nie, musi go mieć

   @Override
    String toString(){
      ... 
    }

ok rozumiem, już poprawione

0
  1. Twój konstruktor wypisuje znaki, a powinien je przechowywać w tablicy.
  2. length() - sprawdź które pola w tablicy masz puste, a które wypełnione i na tej podstawie zwróć rozmiar
  3. trim() - jeżeli znak jest spacją, to go usuń z tablicy
  4. append() - znajdź pierwszy pusty znak w tablicy i dostaw nowy w jego miejsce
  5. insert() - wstaw wymagany znak pod zadane pole w tablicy, resztę znaków musisz przesunąć.
2
Tomasz J napisał(a):

Mam poważny problem w moim życiu i w dążeniu do bycia programistą. Skończyłem kurs, wiele nauki

"Skończyłem kurs" ... a czytałem coś solidnego? Jakiś Hosrtsman - o ile wielu pytającym polecam wydania "zaawansowane" Hosrstmana, to dla ciebie i bazowa by była zbawienna., Joshua Bloch. Sorry, ale to elementarz obiektowości i javy (nie mówię o proceduralnych hello worldach na 50 linii)
Nikt rozsądny nie będzie specjalnie dla ciebie pisał wiedzy dostępne w bazowej ksiażce

Widocznie był to słaby kurs.
Nie weź tego emocjonalnie, ale w moim zespole nie byłoby z ciebie pożytku. Nie mamy etatu niańki na aproduktywnymi stażystami.

.. w dążeniu do bycia programistą. ..

To zawód, gdzie STALE się ryje za wiedzą, uzupełnia, dokształca, tworzy wersje próbne, kasuje lub refaktoryzuje .. pewien jesteś że to dla ciebie ?

2
Tomasz J napisał(a):
     int size = 1000;
     char array[] = new char[size];

A jak będziesz miał więcej niż 1000 znaków to co zrobisz?

     public ChrStr(String input){
         if (input == null ){
             throw new IllegalArgumentException("this is not String");
         } else {
             for (int i = 0; i< array.length; i++){
                 System.out.println(array[i]);
             }
         }
     }

Jak już była mowa wypisujesz zamiast przypisywać

     public ChrStr lenghtBebechy(){
         return null;
     }
     public ChrStr trimBebechy(){
         return null;
     }
     public ChrStr appendBebechy(char sign){
         return null;
     }
     public ChrStr insertBebechy(int index,char sign){
         return null;
     }
     //pokazuje mi, że tu ma być String ale muszę tu użyć swojej klasy chyba tak ?
     public ChrStr toString(){
         return null;
     }

Po co tworzysz metody na zapas? Jeszcze z tak głupimy nazwami?

2

Ja proponuję zacząć od takiego działąjącego minimum:

class ChrStr {
  private char state[];

  public ChrStr() {
    state = new char[];
  }
  public ChrStr(String value) {
    state = value.toCharArray();
  }

  public String toString() {
    return String.valueOf(state);
  }

  public int length() {
    return state.lenght;
  }
}
1
Tomasz J napisał(a):
        String nazwa = "nazwa";

To jest fabryczny String, a nie twój.Nawiasem mówiac jedynie fabryczny da się tak zainicjować literałem w pazurkach (to wynika z wysokiej kompatybilności w budowie języka Java)

Na twoim ma to wyglądać - i nie wyobrażam sobie inaczej:

ChrStr  my = new ChrStr ("nazwa")
0

Myślę, że z tego wszystkiego jestem już w stanie coś ukodzić. Biorę się do roboty.

0
Tomasz J napisał(a):
package org.example;

public class ChrStr {

    int size = 1000;//skąd wiesz jaki rozmiar będzie potrzebny? Potrzebujesz wiedzieć na tym etapie?
    char array[] = new char[size];

    public ChrStr(){
      //utwórz pustego "stringa"
    }

    public ChrStr(char[] array){
        this.array = array; //wycieka ci array, można zmienić dane twojej klasy z zewnątrz, zmieniając to co jest w parametrze
    }

    public ChrStr(String input){
        if (input == null ){
            throw new IllegalArgumentException("this is not String");//czemu nie utworzyć pustego stringa?
        } else {
            for (int i = 0; i< array.length; i++){
                System.out.println(array[i]);//co to ma robić? czemu nie zrobisz array = input.toCharArray()?
            }
        }
    }
    public ChrStr lenghtBebechy(){
        return null; //WTF?
    }
    public ChrStr trimBebechy(){
        return null; //WTF2?
    }
    public ChrStr appendBebechy(char sign){
        return null; //WTF3
    }
    public ChrStr insertBebechy(int index,char sign){
        return null; //WTF4?
    }
    //pokazuje mi, że tu ma być String ale muszę tu użyć swojej klasy chyba tak ?
    public ChrStr toString(){
        return null; //return new String(array)
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");


        String nazwa = "nazwa";

        nazwa.length();
        nazwa.trim();

        char sign = '!';

        StringBuilder nazwa1 = new StringBuilder().append("c").insert(1,1);
        System.out.println(nazwa1);
//a tego co wyżej, to nie powinieneś jednak zrobić "swoją" klasą?

        ChrStr chrStr = new ChrStr("name");
        System.out.println(chrStr);// to ci zadziała, jak prawidłowo zaimplementujesz metodę toString()
    }

}

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