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.