Długość najdłuższego spójnego fragmentu [PILNE]

0

Witam. Na już potrzebuję rozwiązanie zadania z wykorzystaniem funkcji split. Są to podstawy(wiem), a ja potrzebuję na podwyższenie oceny ostatniego zadania z którym się kopię od 2 dni. Dla wielu z was jest to zapewne banalne. Proszę was o pomoc, zależy mi na tym.

Treść zadania:

W pliku dane.txt znajduje się 100 wierszy. Każdy wiersz zawiera parę danych składającą się z liczby całkowitej z przedziału od 3 do 100 i słowa (ciągu znaków) złożonego z małych liter alfabetu angielskiego o długości od 1 do 50 znaków. Liczba i słowo są oddzielone znakiem przecinka ",".
Napisz program, dający odpowiedzi do poniższego zadania. Uzyskane odpowiedzi zapisz w pliku odpowiedzi.txt.
Dla każdego słowa z pliku dane.txt znajdź długość najdłuższego spójnego fragmentu tego słowa złożonego z identycznych liter (w programie nie bierzemy pod uwagę spacji – usuń je zarówno przy liczbach jak i słowach). Znajdowanie fragmentu najdłuższego spójnego fragmentu słowa wraz z ilością znaków napisz jako metodę statyczną zwracającą wartość (zwróć to jako łańcuch znaków). Wypisz do odpowiedniego pliku znalezione fragmenty słów i ich długości oddzielone spacją, po jednej parze w każdym wierszu. Jeżeli istnieją dwa fragmenty o takiej samej największej długości, podaj pierwszy z nich. Wyniki podaj w kolejności zgodnej z kolejnością danych w pliku dane.txt. Na samym końcu pliku odpowiedzi.txt zapisz sumę wszystkich liczb z pliku dane.txt

Link do pliku dane.txt

Mój napoczęty kod:
import java.io.*;
import java.util.Scanner;

public class LiczZdania {

public static void main(String[] args) throws IOException {
    File plik = new File("lista8.txt");
    Scanner odczyt = new Scanner(plik);

    String odczytWiersza;
    char znak, znakDalej, zapiszZnak = 0;

    while (odczyt.hasNext()) {
        odczytWiersza = odczyt.next();

        String[] splitWiersza = odczytWiersza.split(" ");
        for (int i=0; i<splitWiersza.length; i++)
            System.out.println(splitWiersza[i]);


    }
    
    odczyt.close();
}

}

0

Zrób najpierw split.(","), a potem usuń spacje.

0

@lion137: Zrobiłem trochę inaczej:

String odczytWierszaBezSpacji = odczytWiersza.trim();
String[] splitWiersza = odczytWierszaBezSpacji.split(",");

Jednak nadal zastanawiam się nad dalszą częścią.
Właściwie problem z zadaniem jest tylko w tym miejscu.
"znajdź długość najdłuższego spójnego fragmentu tego słowa złożonego z identycznych liter " następnie wypisania tej wartości
Bo wymyśliłem by przechodził mi znak po znaku i rzutowałem go po int i porównywałem wartość znaku n oraz n+1, ale przy wydruku zmieniał mi ich wartości.

0

Bo wymyśliłem by przechodził mi znak po znaku i rzutowałem go po int i porównywałem wartość znaku n oraz n+1, ale przy wydruku zmieniał mi ich wartości.

Po co rzutować na int? To prosta pętla, która porównuje dwa znaki obok siebie i za każdym razem gdy są takie same zwiększa licznik, gdy są różne zeruje licznik, a w międzyczasie liczy maksimum.

0

@nalik: No właśnie z tego względu, że się w tym gmatwam proszę o sugestię. Konkretną, wiem, że muszę sprawdzić znak x ze znakiem x+1, następnie policzyć ile razy wynik będzie pozytywny, a na końcu wypisać znak powtórzony y razy.

0

Bez wchodzenia w szczegóły:
Napisz funkcję która przyjmuje na wejściu String i wypisuje wszystkie litery z podanego słowa w nowej linii np

słowo alamakota powinno dać

a
l
a
m
a
k
o
t
a

Jak to będziesz mieć to potem dodamy zliczanie liter, najpierw iteracja / przejście po wszystkich literach.

0

@lubie_programowac:
import java.io.*;
import java.util.Scanner;

public class LiczZdania {

public static void main(String[] args) throws IOException {
    File plik = new File("lista8.txt");
    Scanner odczyt = new Scanner(plik);

    String odczytWiersza, odczytWierszaBezSpacji, odczytLiczby;
    String[] splitWiersza;
    char znak = 0, znakDalej, wartoscNa = 0, wartoscPo, znakLiczby = 0;
    int liczeIle = 0;

    while (odczyt.hasNext()) {
        odczytWiersza = odczyt.next();
        odczytLiczby = odczyt.next();

        odczytWierszaBezSpacji = odczytWiersza.trim();
        splitWiersza = odczytWiersza.split(",");

        for(int i=0; i < splitWiersza.length; i++){
           String test1 = splitWiersza[i];
           String test2 = splitWiersza[i+1];
        }
    }
    odczyt.close();
}

}

0

@Klawiatur17: Ludziska, ja nie proszę o to, żebyście dali mi zadanie gotowca. Ja bardzo chętnie zrobię to sam, proszę byście mi powiedzieli np.
Słuchaj, trzeba zastosować taką i taką metodę, tą funkcję, jeżeli masz problem w tym miejscu to spróbuj zrobić charAt i +1, pobierz to tak ponieważ...
Jak ludzie którzy nie potrafią programować, uczą się dopiero mają przejść poziom wyżej jak przyjdą poprosić o pomoc to spotykają się z komentarzami - "Jak jest to zadanie dla Ciebie to znaczy, że masz to zrobić sam, jak nie umiesz to trudno". K*rwa jak rybacy. Przecież to tak demotywuje, że aż szok. Jak nie wiem co z tą społecznością jest nie tak. Ja nie wiem, czujecie się lepsi w momencie kiedy ktoś prosi o pomoc i wy z dużym doświadczeniem musicie jeszcze bardziej boostować swoje ego i zamiast pomóc dajecie uszczypliwe komentarze. Czemu nie można w prosty sposób wyjaśnić komuś pełnym zdaniem co robi nie tak, jak może sobie z tym poradzić?

2
Klawiatur17 napisał(a):

Jak nie wiem co z tą społecznością jest nie tak. Ja nie wiem, czujecie się lepsi w momencie kiedy ktoś prosi o pomoc i wy z dużym doświadczeniem musicie jeszcze bardziej boostować swoje ego i zamiast pomóc dajecie uszczypliwe komentarze. Czemu nie można w prosty sposób wyjaśnić komuś pełnym zdaniem co robi nie tak, jak może sobie z tym poradzić?

Społeczność 4p jest świetna i bardzo pomocna, jesli widzi że ktoś sam wykazuje chęć rozwiązania, nawet jak coś kompletnie zwali to naprowadza. Tu zadeklarowali ludzie, że pomogą Ci pod warunkiem, że włożysz minimum wysiłku i zaczniesz sam pisać. Ty w zamian wyjeżdżasz z pretensjami, że nie poprowadzą Cię za rękę - pewnie to byłoby mniej czasochłonne jakby wkleić tu gotowca, niż Ci tłumaczyć, ale byłoby zero nauki dla Ciebie. Ja uważam, że skoro tak, to nie zasługujesz na pomoc i powinieneś dostać ocenę adekwatną do umiejętności, albo założyć temat w "ogłoszenia drobne" i zapłacić.

3

@Klawiatur17: Wyniknęło nieporozumienie. Serdecznie przepraszam wszystkich użytkowników. Nie chcę nikogo urazić, jest to wynik nieporozumienia z mojej winy.

0
public static void main(String[] args) throws IOException {
        File plik = new File("lista8.txt");
        Scanner odczyt = new Scanner(plik);

        String odczytWiersza, odczytWierszaBezSpacji;
        String[] splitWiersza;
         char[] tabZnakow;
        int liczeIle = 0;

        while (odczyt.hasNext()) {
            odczytWiersza = odczyt.next();

            odczytWierszaBezSpacji = odczytWiersza.trim();
            splitWiersza = odczytWiersza.split(",");

            for(int i =1; i < splitWiersza.length; i++){
                char[] tabZnakow = splitWiersza[i].toCharArray();

            }



        }
        odczyt.close();
    }
0

Próbuję zrobić cały czas coś takiego, mózg nie pozwala mi inaczej i nie rozumiem czemu.

while (odczyt.hasNext()) {
            odczytWiersza = odczyt.next();

            odczytWierszaBezSpacji = odczytWiersza.trim();
            splitWiersza = odczytWiersza.split(",");

            for(int i = 0; i < splitWiersza.length; i++){
                tabZnakow1 = splitWiersza[i].toCharArray();
                tabZnakow2 = splitWiersza[i+1].toCharArray();
                if(tabZnakow1 == tabZnakow2)
                    liczeIle++;
            }
        }
        System.out.println("Test: " + liczeIle);
        odczyt.close();```
0

@Klawiatur17: zgubiłem się już totalnie, namieszałem już tyle, że nie wiem o co chodzi właściwie.
```java
while (odczyt.hasNext()) {
odczytWiersza = odczyt.next();

        odczytWierszaBezSpacji = odczytWiersza.trim();
        splitWiersza = odczytWiersza.split(",");

        tabZnakow1 = splitWiersza[0].toCharArray();

        System.out.println(tabZnakow1);
        
    }
0

Klawiatur17 chcesz zjeść za duży kawałek na raz.

Kod z Długość najdłuższego spójnego fragmentu [PILNE] jest w miarę ok. Posiada on kilka błędów, usuń z niego kod odpowiedzialny za dzielenie linii na segmenty - zostaw/dodaj tylko kod który wczyta wszystkie linie z pliku oraz wypisze te linie do konsoli, bez trima - 1:1 to co jest w pliku. Napisz potem jakie masz dwie pierwsze oraz dwie ostatnie linie które wypisałeś. Dzięki temu sprawdzimy czy dobrze odczytujesz plik. Będziemy zadania rozwiązywać małymi krokami żeby zminimalizować stan "zgubiłem się już totalnie, namieszałem już tyle, że nie wiem o co chodzi właściwie."

Napisz też słownie jak chcesz napisać ten algortym, może być w punktach, może być w pseudokodzie, może być słownie (najmniej preferowane).

0

@lubie_programowac:

while (odczyt.hasNext()) {
            odczytWiersza = odczyt.next();
            splitWiersza = odczytWiersza.split(",");

            for(String indeks: splitWiersza)
                System.out.println(indeks);
        }

Dwie pierwsze:
68
dnmjhmj;

Dwie ostatnie:
59
djkjkjfjkfmk

0
  1. Co jest trzymane w splitWiersza?
  2. Ile elementow ma ta tablica?
  3. Ile razy wykona sie petla while?
Klawiatur17 napisał(a):

@lubie_programowac:

while (odczyt.hasNext()) {
            odczytWiersza = odczyt.next();
            splitWiersza = odczytWiersza.split(",");

            for(String indeks: splitWiersza)
                System.out.println(indeks);
        }
0
String slowo = "ala,ma,kota,kot,ma,ale";
int rozmiar = slowo.split(",").length;
System.out.println(rozmiar);

Jaka wartość tutaj będzie zwrócona?

0
String zdanie = "ala,ma,kota,kot,ma,ale";
String slowo = zdanie.split(",")[2];
System.out.println(slowo);

Co teraz będzie zwrócone? Jak należy odczytać pierwszy ("ala") element? A jak należy odczytać ostatni ("ale")?

0

Popraw program z Długość najdłuższego spójnego fragmentu [PILNE] żeby wypisywał tylko słowo, bez liczby.

0

@lubie_programowac:

        while (odczyt.hasNext()) {
            odczytWiersza = odczyt.nextLine();

            odczytWierszaBezSpacji = odczytWiersza.trim();
            String[] odczytWierszaBezLiczby = odczytWierszaBezSpacji.split("[0-99]");

            for(String indeks: odczytWierszaBezLiczby)
                System.out.println(indeks);

        }

Chodzi o to?

0

Napisz kroki algorytmu żeby zrobić to zadanie, bez javy - normalnie słownie napisz co należy zrobić jakbyś tłumaczył rodzicom.

0

@Klawiatur17:

  1. Wycztaj plik dane.txt
  2. Odczytaj wiersz z pliku dane.txt
  3. Pobierz tablicę znaków danego wiersza.
  4. Sprawdź znak pierwszy ze znakiem następującym.
  5. Jeżeli znak n == n+1
  6. zapisz znak, licz ile razy warunek jest prawdziwy.
  7. wydrukuj wiersz, który czytałeś, wydrukuj wynik dla danego wiersza.
  8. jeżeli po przeczytanym wierszu, jest wiersz następny
  9. przejdź do punktu trzeciego
  10. jeżeli nie, zakończ zadanie
0

Dobra bierzemy pierwszy przykład z Twojego pliku:

68, dnmjhmj

Co ma zwrócić program dla tego przypadku?

A dla

21, klllllllrtmmmwer
21 , a
3, asq
33,eujiykjjkj
?

0
  1. d 1;
  2. lllllll 7;
  3. a 1;
  4. a 1,
  5. jj 2;

Ekstra wszystko dobrze. Powiedz dlaczego
a) w trzecim samo a, a nie spacje skoro jest to pierwszy powtarzający się ciag w wierszu?
b) w ostatnim jj a nie 33 skoro jest to powtarzający się pierwszy ciąg?

Idąc zgodnie z algorytmem Długość najdłuższego spójnego fragmentu [PILNE] dostalibyśmy inne wyniki dla tych punktów.

0

@lubie_programowac:
3. Spacje jak w zadaniu było podane mają być usunięte, a "a" jest różne od znaku następnego, pustego
5. ponieważ ma być to ciąg znaków, jak miałem w swoim przykładzie podanym w zadaniu, zatem biorąc pod uwagę tablicę ascii, zakres 97 -122

0

Według treści zadania to w każdym wierszu są dwie różne dane, a Ty próbujesz po nich iterować zamiast je sobie uporządkować.

int liczba = Integer.parseInt(splitWiersza[0].trim());
String słowo = splitWiersza[1].trim();
0

@Klawiatur17:

Może zacznij od tego:

        while (odczyt.hasNext()) {
            final String wiersz = odczyt.nextLine();
            final String[] wierszPodzielony = wiersz.split(",");

            if (wierszPodzielony.length != 2) {
                break;
            }
            
            int liczba = Integer.parseInt(wierszPodzielony[0].trim());
            final String slowo = wierszPodzielony[1].trim();
            
            System.out.println(liczba);
            System.out.println(slowo);
        }
0

@nalik:
Zrobiłem tak, wypisuje mi teraz znak po znaku.

 while (odczyt.hasNext()) {
            final String wiersz = odczyt.nextLine();
            final String[] wierszPodzielony = wiersz.split(",");

            if (wierszPodzielony.length != 2) {
                continue;
            }

            int liczba = Integer.parseInt(wierszPodzielony[0].trim());
            String slowo = wierszPodzielony[1].trim();

            char[] lancuchZankow = new char[slowo.length()];

            for (int i = 0; i < slowo.length(); i++) {
                lancuchZankow[i] = slowo.charAt(i);
            }

            for (char ch : lancuchZankow)
                System.out.println(ch);
        }

Aaa no i jeszcze chciałbym się upewnić w tym:

            if (wierszPodzielony.length != 2) {
                continue; 
            }
  • Pomija puste wiersze?
0
Klawiatur17 napisał(a):

@Klawiatur17:

  1. Wycztaj plik dane.txt
  2. Odczytaj wiersz z pliku dane.txt
  3. Pobierz tablicę znaków danego wiersza.

OK, to już masz.

Klawiatur17 napisał(a):

@Klawiatur17:

  1. Sprawdź znak pierwszy ze znakiem następującym.
  2. Jeżeli znak n == n+1
  3. zapisz znak, licz ile razy warunek jest prawdziwy.

Teraz musisz to zaimplementować. Proponuję uszczegółowienie (można to zrobić inaczej, to tylko propozycja):
4. Sprawdź znak pierwszy ze znakiem następującym poprzednim.
5. Jeżeli jest taki sam to: zwiększ licznik długości.
6. Jeżeli licznik jest większy od najdłuższej długości do tej pory, to uktualnij najdłuższą długość. Zapisz także znak jako najlepszy.
7. Jeżeli znak był inny, to ustaw licznik na 1, bo właśnie rozpoczął się inny blok znaków.
8. Zapisz aktualny znak jako poprzedni.

Po zakończeniu pętli wspomniana "najdłuższa długości do tej pory" to jest długość najdłuższego podciągu, a najlepszy znak to oczywiście to czego szukasz.

0

@nalik: Wymyslilem cos takiego, wiem, ze jest czesciowo bledne

        while (odczyt.hasNext()) {
            final String wiersz = odczyt.nextLine();
            final String[] wierszPodzielony = wiersz.split(",");

            if (wierszPodzielony.length != 2) {
                continue;
            }

            int liczba = Integer.parseInt(wierszPodzielony[0].trim());
            String slowo = wierszPodzielony[1].trim();

            char[] lancuchZankow = new char[slowo.length()];

            for (int i = 0; i < slowo.length(); i++) {
                lancuchZankow[i] = slowo.charAt(i);

                if(slowo.length() == slowo.length()+1){
                    liczeIle++;
                    System.out.print(lancuchZankow[i]);
                } else
                    System.out.print(lancuchZankow[0]);
            }
            System.out.println(" " + liczeIle);

//            for (char ch : lancuchZankow)
//                System.out.println(ch);
        }

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