Niepoprawne działanie funkcji

0

Cześć,
W ramach nauki javy rozwiązuje małe zadanka, mam natomiast problem jednym z nich oto one:

package Zad4;

import java.util.Scanner;

public class Zad4 {
	/*
	 * PObierz od usera napis i sprawdz czy składa sie z dokladnie dwoch
	 * wyrazow. Jezeli tak,to sprawdz czy pierwszy ma tylko same litery duze, a
	 * drugi napis ma tylko same litery male. Jezeli tak to wyswitl komunikat
	 * OK, nie nie to wyswietl NOT OK.
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("Enter a string: ");
		String string = sc.nextLine();
		sc.close();
		System.out.println("-----------------");
		y(stringCount(checkLength(string)), string);
	}

	public static int checkLength(String string) {
		int word = 0;
		char[] c = new char[string.length()];
		
		for (int i = 0; i < string.length(); i++) {
			c[i] = string.charAt(i);
			if (((i > 0) && (c[i] != ' ') && (c[i - 1] == ' ')) || ((c[0] != ' ') && (i == 0)))
				word++;
		}
		return word;
	}
	public static boolean stringCount(int word){
		if(word == 2){
			return true;
		}
		else{
			return false;
		}
		
	}
	public static void y (boolean next, String string){
		String[] tab = string.split(" ");
		
		if(next == true){
			for(int i =0; i < tab.length; i++){
				if(Character.isUpperCase(tab[0].charAt(i))
						&& Character.isLowerCase(tab[1].charAt(i))){
					System.out.println("OK");
				}
				else{
					System.out.println("NOT OK is: " + tab[i]);
				}
			}
		}
		else{
			System.out.println("Podałeś za dużo słów");
		}
	}

}

Błąd pole na tym że jak wpisze: Aaa bb lecą komunikaty- OK, NOT ok is: bb gdzie jest to dobrze, a kiedy wpisze AAA bb leci OK.
I mam jeszcze dodatkowe pytanie czy takie rozbijanie na funkcje jest to dobre podejście czy raczej za bardzo jest to rozbite ( na siłe ) ?

0

Jest za mało rozbite bo w ogóle nie wiadomo co sie w kodzie dzieje. A co do głownego problemu: użyj debugera.
Robisz tu w ogóle jakieś cuda na kiju. Ja bym zrobił tak:

  • String[] slowa = linia.split(" ") i sprawdzamy czy tablica ma 2 elementy czy nie
  • następnie porównuje sobie czy slowa[0].toUpperCase().equals(slowa[0]); i analogicznie czy slowa[1].toLowerCase().equals(slowa[1]);

jeśli juz bardzo chcesz to robić ręcznie to napisz dwie funkcje, jedną do sprawdzania czy same małe a drugą czy same duże.

A ty tu robisz jakąś pseudo-funkcyjną ewaluacje ;]

0

Pomysł @Shalom`a jest elegancki, ale nie zadziała, jeśli użytkownik wpisze dwa słowa, ale rozdzieli je kilkoma spacjami, tabulatorem lub kombinacją spacji i tabulatora.

String[] words = line.split("\\s+");

Inna sprawa, usuń instrukcję

 sc.close();

i nigdy w przyszłości nie zamykaj Scannera czytającego z klawiatury.

0

Mogę wiedzieć dlaczego nigdy nie zamykać?
Czytałem gdzieś że należy zamykać aby nie blokować pamięci?

0

dokładnej odpowiedzi nie udzielę, ale od Javy 8, scanner zamykany jest automatycznie

0

Scanner (na szczęście) nie jest zamykany automatycznie. Zamykanie Scannera czytającego z klawiatury doprowadzi w końcu do takiego mniej więcej kodu:

import java.util.Scanner;
public class ClosingScanner
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.print("Wpisz cos waznego: ");
        sc.nextLine();
        sc.close();
        /*
           bardzo ważne instrukcje
        */
        sc = new Scanner(System.in);
        System.out.print("Wpisz cos mniej waznego: ");
        sc.nextLine();        
    }
}

Wypróbujcie.

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