Rozszerzone zliczanie elementów w tekście

0

Witam, szukam pomocy bo nie mam już pomysłu jak ruszyć dalej. Jestem początkujący i uczę się właśnie Javy .

Mam do napisania program który zlicza ilość liter podanych w tekście, następnie dla sprawdza czy któraś z liter występuję więcej niż 2 razy od pozostałych i jeżeli taka jest wyświetla nr zdania (zdania oddzielone są od siebie kropkami), a także tą literę. Potrafię bez problemu zliczyć ilość liter w tekście za pomocą mapy albo tabeli, problem się zaczyna dalej. Nie wiem jak w przypadku mapy:

Scanner sc=new Scanner(System.in);
        String line;
        int[] tb=new int[26];
        line=sc.nextLine().toUpperCase(); //pobieranie tekstu.
        Map<Character, Integer> mapaLiter = new TreeMap<Character, Integer>(); //utworzenie mapyLiter
        for(int i=0;i<line.length();++i)
        {
            char litera=line.charAt(i);
            if(!mapaLiter.containsKey(litera)){
                mapaLiter.put(litera,0);
            }
            mapaLiter.put(litera,mapaLiter.get(litera)+1);
        }

Porównać później te wartości? Próbowałem to zrobić poprzez iteracje po bytach, więc zamieniłem to na :


            Scanner sc=new Scanner(System.in);

            String line;
            int[] tb=new int[26];
            line=sc.nextLine().toUpperCase(); //

        Map<Byte, Integer> mapaLiter = new TreeMap<Byte, Integer>();

        for(int i=0;i<line.length();++i)
        {
            byte litera= (byte) line.charAt(i);
            if(!mapaLiter.containsKey(litera)){
                mapaLiter.put(litera,0);
            }
            mapaLiter.put(litera,mapaLiter.get(litera)+1);
        }

//zliczanie ilości powtórzeń:
        int licznik1 = 64;
        int licznik2 = 64;
        int petle = 0;
        for (byte i = 65; i < 91; i++) {
            if (mapaLiter.get(i) > licznik1 && !(mapaLiter.get(i) == null) ) {
                licznik2 = licznik1;
                licznik1 = mapaLiter.get(i);
                petle = i - 65;
            }   else if (mapaLiter.get(i) > licznik2 && !(mapaLiter.get(i) == null)) {
                licznik2 = mapaLiter.get(i);
            }
            if (licznik1 > 2 * licznik2 && licznik1 > 0) {
                System.out.println(mapaLiter.get(i));
        }

        }

Ale nadal wywala błąd "Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is null
at com.wojciech.lukasz.mytych.Main.main(Main.java:35)" mimo że dałem warunek który niby ma temu zapobiegać?

Próbowałem tego samego za pomocą tabeli ale też bez większych sukcesów:


package com.wojciech.lukasz.mytych;

import java.util.*;

public class Main {

    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        String line;
        int[] tb=new int[26];
        line=sc.nextLine().toUpperCase();
        for(int i=0;i<line.length();++i)
        {
            int pos=line.charAt(i)-'A';
            if((0<=pos)&&(pos<26)) ++tb[pos];
        }
        for(int i=0;i<tb.length;++i) if(tb[i]!=0) System.out.print(((char)('A'+i))+": "+tb[i]+", ");

        //porównywanie:
        int l1 = -1;
        int l2 = -1;
        int l3 = 0;
        String tekst = "BRAK";
        char znak = 'a';

        for (int i = 0; i < tb.length; ++i) if (tb[i]!=0){
            if (tb[i] > l1) {
                l2 = l1;
                l1 = tb[i];
                l3 = i;
            }
            else if (tb[i] > l2) {
                l2 = tb[i];
            }
            if(l1 > 2 * l2 && l1 > 0) {
                System.out.println();
            }
        }

        }

    }


Moglibyście wskazać co robię źle i czy źle w ogóle się za to zabieram? I pytanie czy jest możliwość dostania się do klucza mapy poprzez wartość ? Np. wyświetlić wszystkie klucze w mapie przyjmujące wartości np char 'a' , myśle że pomogłoby mi to popchnąć sprawę do przodu. Z góry dziękuję za wszystkie odpowiedzi i wskazówki.

1

Nie chce mi sioę w nocy debugowac twojego kodu.
Kilka uwag:
1, Map Map<Byte, Integer> mapaLiter masz przekombinowany, Byte jest tam niepotrzebny / miesza

  1. Gramatycznie nie rozumiem Potrafię bez problemu zliczyć ilość liter w tekście za pomocą mapy albo tabeli, problem się zaczyna dalej. Nie wiem jak w przypadku mapy

  2. Czy jak piszesz 'tabela' to myślisz 'tablica' ? Język polski (informatyczny też) to różnicuje

Nietaktowny napisał(a):

Moglibyście wskazać co robię źle i czy źle w ogóle się za to zabieram? I pytanie czy jest możliwość dostania się do klucza mapy poprzez wartość ? Np. wyświetlić wszystkie klucze w mapie przyjmujące wartości np char 'a' ,

4 .Zdanie wydaje się sprzeczne (ale może późna pora ;) ) z resztą i treścią zadania.
Nawiasem mówiąc, gdybyś Map zrobił na typach w pełni naturalnych, bez żadnych konwersji, samo to już by dawało do myślenia i je prostowało. Gruszka nie pasuje do Jabłek itd

  1. Co robi zestaw z pętlą poniżej tekst = "BRAK"; to za nic nie umiem przeczytać. Nazwy zmiennych by pomogły, wydzielenie do funkcji o DOBREJ nazwie też.
2

Mam do napisania program który zlicza ilość liter podanych w tekście, następnie dla sprawdza czy któraś z liter występuję więcej niż 2 razy od pozostałych i jeżeli taka jest wyświetla nr zdania (zdania oddzielone są od siebie kropkami), a także tą literę.

Piszesz program zliczający ilość liter w tekście a potem, że ma wyświetlić numer zdania w którym jest większa dwa razy niż inne. To w końcu liczysz per cały tekst czy per zdanie? Bo ja to rozumiem, że jednak zliczasz per zdanie i chyba porównujesz per zdanie nie?

Może dobrym podejściem by było zaprojektowanie obiektu, który trzyma np. zdanie oraz mapę liter z ich występowaniem? Te obiekty pakujesz do listy i potem możesz sobie szybko sprawdzać w jakim zdaniu jaka litera np. najwięcej razy występuje.

@Nietaktowny prośba o napisanie treści zadania w bardziej zrozumiały sposób.

0
  1. Kod jest zupełnie nieczytelny. Co to są za zmienne l1, l2, l3? o_O
  2. Nie rozumiem polecenia. Co to znaczy: następnie dla sprawdza czy któraś z liter występuję więcej niż 2 razy od pozostałych i jeżeli taka jest wyświetla nr zdania (zdania oddzielone są od siebie kropkami), a także tą literę.? Zliczenie liter jest proste, ale dalej WTF?

więcej niż 2 razy od pozostałych

? Tzn zliczyliśmy że występuje ponad 2x częściej niż następna najczęściej występujca litera?

jeżeli taka jest wyświetla nr zdania

Jakiego znów zdania? Ma wypisać wszystkie zdania w których występuje ta litera?

Najlepiej pokaż przykładowe wejście i oczekiwane wyjscie prgoramu.

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