Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Sprawdzenie czy dany tekst nie jest takim ?


knugi

Rekomendowane odpowiedzi

Opublikowano

Cześć :D Mam porównanie stringów. I napotkałem problem bo nie wiem jak sprawdzić jeżeli tekst wpisany zawiera inne znaki niż 'a b c'

Chciałbym to napisać w warunku

 

if(warunek)

{

//Wyślij wiadomość

}

 

czyli jak mam

if(var.equalsIgnoreCase("a")

{

//Wiadomosc

}

 

i jak zmienna 'var' bedzie a to wyswietli wiadomosc

 

a ja chce ze variables musi zawierać tylko literki: a b c

i jeżeli zawiera inne literki niż te np 'd' to Nie zrobi tego i się pytam jaki jest na to kod

 

Patrzyłem to nic nie znalazłem na takie coś więc bym był bardzo wdzięczny za kodzik :D

Jeżeli pomogłem, daj + Ciebie nic nie kosztuje Mi znaczy wiele.

 

 

 

 

 

 

 

Zachęcam do podsyłania pomysłów na film jako poradniki na YouTube

 

Opublikowano

No to raczej musisz użyć RegEx-a

Jak nie wiesz co to dokładnie jest, to zobacz w google, bo całego chyba nikt ci tu nie opisze ;)

 

Najprościej można użyć metody String.matches jako argument podając wyrażenie regularne -> jako zwykły String.

W typ wypadku to chyba będzie:

if (var.matches("[abc]+"))

"[abc]+"

[abc] oznacza że tutaj jest jakiś znak z tych nawiasów, a,b lub c.

+ czyli że to musi być jeden lub więcej znaków (użyj * dla dowolnej ilości znaków (0 lub więcej) lub {} dla dokładnego określenia {2,5} -> od 2 do 5, {,5} -> do 5, {5,} od 5, {5} -> dokładnie 5)

 

Można to "uprościć" (w tym przykładzie to dużo nie zmienia)

if (var.matches("[a-c]+")) 

tutaj mamy [a-c] czyli od literki a do c, tutaj nie robi to różnicy, ale jak chcemy od a do p to już raczej nie będziemy wypisywać każdej :P

 

 

Jednak takiego czegoś warto używać tylko wtedy jak to jest jakieś pojedyncze sprawdzenie i raczej nie będzie się powtarzać, gdy chcemy coś sprawdzać znacznie częściej to należy użyć klasy Pattern i Matcher

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html

 

Wtedy możemy sobie stworzyć taki "wzór" jako stałą:

private static final Pattern MY_PAT = Pattern.compile("[a-c]+", Pattern.CASE_INSENSITIVE);

Tutaj dodatkowo mamy wygodniejsze wsparcie "flag" czyli to nasze "Pattern.CASE_INSENSITIVE", możemy to też zrobić podając "(?i)[a-c]+"

 

I wtedy używamy np:

if (MY_PAT.matcher(var).matches())

gdzie MY_PAT.matcher() zwraca instancje wymienionej wyżej klasy "Matcher" która ma też sporo innych przydatnych metod ;)

 

Spotkałam się też z tworzeniem jednego Matchera i potem tylko go resetowania zamiast używania ponownie MY_PAT.matcher() 

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#reset(java.lang.CharSequence)

 

Ale nie wiem jaki to ma wpływ na wydajność.

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

Mi na wydajności nie zależy, tylko na tym poziomie co jestem to aby kod działał :D

I mam taki dziwny styl pisania.

 

Piszę teraz programik na Twierdzenie Pitagorasa. Tutaj jest już to co napisałem:

http://pastebin.com/gWXq3jYE

 

i chcę sprawdzić teraz czy liczby a b c (wybór 2) i jeżeli warunek nie jest spełniony to zapyta go jeszcze raz o to.
 

String dane1;
			while(true)
			{
				dane1 = in.nextLine();
				if()
				{
					System.out.println("Nie ma takiej literki (a, b, c)")
				}
			}

i teraz mam takie coś:

while(true)
            {
                dane1 = in.nextLine();
                if(dane1.matches("[abc]{2}"))
                {
                    System.out.println("Nie ma takiej literki (a, b, c)");
                }
                else break;
                
            }
            System.out.println("Kod dalej...");

i jak wpiszę w konsolce na zapytanie 1 2 to wpisze 1:

 

Twerdzenie Pitagorasa:
Podaj liczbę:
[1] Chce odszukac inna liczbe (Wiedząc, że trójkąt jest prostokątny.
[2]Chce sprawdzic czy trojkat jest prostokatny.
1
(a² + b² = c²)
Podaj jakie masz dane:
Kod dalej...
 

 

i Nic więcej :/

 

Teraz mam taki kod:

http://pastebin.com/5iH33Vyh

Jeżeli pomogłem, daj + Ciebie nic nie kosztuje Mi znaczy wiele.

 

 

 

 

 

 

 

Zachęcam do podsyłania pomysłów na film jako poradniki na YouTube

 

Opublikowano

Pomijam to że tym razem ani trochę nie rozumiem o co ty pytasz, napisz to jakoś sensowniej? 

while(true)
            {
                dane1 = in.nextLine();
                if(dane1.matches("[abc]{2}"))
                {
                    System.out.println("Nie ma takiej literki (a, b, c)");
                }
                else break;
                
            }
            System.out.println("Kod dalej...");

Ale to nie ma sensu.

 

1. Wyświetli błąd gdy teoretycznie miało być dobrze, chyba zjadłeś negacje.

2. Jak ty chcesz tu coś wpisać, skoro zezwalasz tylko na wpisanie a,b lub c ? :D bez żadnych liczb.

 

 

Ogólnie opisz dokładniej jaki masz problem, bo takie masło maślane wyszło ;)

Ja spadam, ale na pewno ktoś inny ci pomoże z resztą.

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

Mam Scanner na wpisanie literek i chcę aby wzięło warunek tylko jeżeli są literki a b c, jeżeli coś innego jest to jest else. np coś takiego

 

Mamy taki kod:

package Cosnietak;

import java.util.Scanner;

public class inne {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String abc = in.nextLine();
		if(abc.matches("[abc]{2}"))
		{
			System.out.println("Abc :D");
		}
		else
		{
			System.out.println("To nie jest a ani b ani c");
		}
	}

}

oczywiście mi chodzi tylko o warunek

if(abc.matches("[abc]{2}"))

sprawdzanie czy to jest jakakolwiek z tych literek.

 

a ta petla while(true) jest do sprawdzania czy to jest aby na pewo te literki a jak nie to cofnie i jeszcze raz spyta.

Jeżeli pomogłem, daj + Ciebie nic nie kosztuje Mi znaczy wiele.

 

 

 

 

 

 

 

Zachęcam do podsyłania pomysłów na film jako poradniki na YouTube

 

Opublikowano

hyym, czy ty chcesz pobrać jakie boki posiada użytkownik? by potem z nich policzyć ten brakujący?

 

To jak dla mnie wygodniej było by zapytać użytkownika o kolejne 3 liczby

 

Podaj bok a:

Podaj bok b:

Podaj bok c:

 

I nie wpisanie niczego, lub czegoś co nie jest liczbą sygnalizowało by że to jest ten brakujący bok.

 

 

A przynajmniej wydaje mi się że tak jest wygodniej :P

lub nawet:

Podaj boki (a;b;c):

i ktoś podaje: 5.56;x;10.3

Dzielisz na 3 części (String.split) i patrzysz która to x.

Wygodniej wtedy dodać jakieś masowe sprawdzanie, np 10 000 przykładów z pliku :D

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

*Wtrącę się*

 

No to raczej musisz użyć RegEx-a

 

 

Używanie wyrażeń regularnych do sprawdzenia czy tekst składa się z odpowiednich znaków jest karygodne IMO.

 

W ogóle, do każdego walidowania danych. http://blog.codinghorror.com/regex-use-vs-regex-abuse/

Opublikowano

*Wtrącę się*

 

 

Używanie wyrażeń regularnych do sprawdzenia czy tekst składa się z odpowiednich znaków jest karygodne IMO.

Po zadaniu pytania, głównie myślałam że to tylko przykład :P

 

I RegEx jednak jest dość wygodny, niż jakieś ręczne sprawdzanie.

Ale miło by było jak byś napisał czym to najlepiej sprawdzać i dlaczego? Może mi się kiedyś przyda, a nauczyć się czegoś nowego chyba nie zaszkodzi :D

 

Bo nie wiem o jaki kod ci chodzi, ale robienie np czegoś takiego:

for (char c:string.toCharArray())
{
    if (c == 'a' || c == 'b' || c == 'c' || ... || c == 'z')
    {
        continue;
    }
    return false;
}
Nie wygląda zbyt wygodnie :D Pewnie jest za to szybsze.

 

+ testy wychodzą dość ciekawe.... Za to sprawdziłam że używanie matcher.reset, zamiast tworzenie nowego... wychodzi szybciej :D

 

 

A wyniki... (ns) "[a-k]+", 1_000_000 testów

p1: 338.452442  ->  używanie pattern.matcher(string)

p2: 250.408596 -> matcher.reset(string).matches

p3: 65.638172 -> sprawdzanie kazdej literki w pętli

Różnica niby jest, ale czy w takim programie te 180 ns coś zmieni? :P

 

EDIT: za to różnice większe zaczynają się pojawiać przy większych tekstach, więc jak komuś zależy na szybkości... to zawsze warto napisać coś własnego dostosowanego tylko pod to.

To co uniwersalne, zawsze jest gorsze :D

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano
Ale miło by było jak byś napisał czym to najlepiej sprawdzać i dlaczego? Może mi się kiedyś przyda, a nauczyć się czegoś nowego chyba nie zaszkodzi :D

 

for (char c:string.toCharArray())
{
    if (!(c >= 'a' && c <= 'c')) return false;
    return true;
}

KISS

 

Za to sprawdziłam że używanie matcher.reset, zamiast tworzenie nowego... wychodzi szybciej :D

 

 

Bo pattern w regexie musi być odpowiednio reprezentowany i konwersja tekstu na tą reprezentację trochę kosztuje.

 

Różnica niby jest, ale czy w takim programie te 180 ns coś zmieni? :P

 

ms nie ns

to jest 4-5 krotny wzrost wydajności.

Przy czym robisz jeszcze niepotrzebnie dużo porównań.

 

I RegEx jednak jest dość wygodny, niż jakieś ręczne sprawdzanie.

 

kombajn na muchę

sprawdzenie w pętli takiego warunku chyba nie jest też jakimś dużym nakładem?

 

 

dasz ten swój kod do testów?

Opublikowano

 

for (char c:string.toCharArray())
{
    if (!(c >= 'a' && c <= 'c')) return false;
    return true;
}
KISS

 

Bo pattern w regexie musi być odpowiednio reprezentowany i konwersja tekstu na tą reprezentację trochę kosztuje.

 

ms nie ns

to jest 4-5 krotny wzrost wydajności.

Przy czym robisz jeszcze niepotrzebnie dużo porównań.

 

jakie ms? o.O

serio uważasz że średni czas porównywania kilku liczb może wynosić 65ms? :D

Więc zdecydowanie ns.

 

Jest wzrost, więc jak ktoś robi dużo porównań, i zależy mu na szybkości, to się opłaca.

Ale jak to tylko prsty program co robi proste sprawdzenie raz na jakiś czas, to już lepiej użyć to co wygodniejsze :D Ale sam wzrost na pewno jest ;)

 

I nie chodziło o tworzenie kolejnego Pattern tylko chodziło o robienie czegoś w stylu

Matcher m = pat.matcher(str);
// sprawdzenie
m.reset(otherStr)
// sprawdzenie
m.reset(otherStr2)
// sprawdzenie
// itd...
zamiast typowego:

Matcher m = pat.matcher(str);
Matcher m2 = pat.macher(otherStr);
//itd...
for (char c:string.toCharArray())
{
    if (!(c >= 'a' && c <= 'c')) return false;
    return true;
}
kurde, myślałam nawet nad tym, ale zapomniałam w końcu dodać do testu :D gorzej jak to będzie coś bardziej skomplikowanego.

No i zrobiłeś błąd <3

Poprawnie:

for (char c:string.toCharArray())
{
    if (!(c >= 'a' && c <= 'c')) return false;
}
return true;

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano
jakie ms? o.O

 

milisekundy

 

serio uważasz że średni czas porównywania kilku liczb może wynosić 65ms? :D

 

no jak mówisz, że milion testów

 

podawaj lepiej informacje

 

 

co do reszty przyznaję rację

Opublikowano

milisekundy

 

no jak mówisz, że milion testów

 

podawaj lepiej informacje

 

 

co do reszty przyznaję rację

Ale średnia czasów, a co znaczy skrót ms to wiem :D Tylko nie wiem jakim cudem miał by się tam pojawić.

 

Może fakt że nie dopisałam "to są średnie czasy" czy cuś (tak jakoś mi ucięło by dopisać), ale jednak po kropce można się domyślać że to nie ms, bo kto tak liczy? :D

No ale uj tam.

 

Ech... a ja zamiast robić to co muszę na jutro mieć gotowe a zrobiłam do tej pory 0% to robię jakieś głupie testy czasowe <3

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

** Wtrącę się też **

Ja akurat regexy używam właśnie w takich pierdołach, małe szybkie (O(N)) i przejrzyste.
Ale tak jak sopel powiedział, sie do nich nie przyzwyczajaj bo gdy będziesz chciał napisać matchera do jakiejś skomplikowanej konstrukcji tekstowej to sam matcher bd miał pierdylion znaków i będzie pierdylion razy wolniejszy. Jeśli mówimy o pojedynczych pierdołach takie jak te, to jest okej i przejrzyście, a funkcje sprawdzania charów pewnie by trzeba było opisać żeby np jakiś inny dev wiedział co to robi, a tak spojrzy na regexa i już wie, to samo się tyczy daty czy innych pierdół.

o8HfXuR.png

CAPSLOCK TEAM - LEPIEJ WIDOCZNI WIDOCZNIE LEPSI

Cała prawda o LittleBlack

Opublikowano

Dobrze, fajnie, że już się porozumieliście, a ja dalej nie rozwiązałem swojego problemu ^^ i nic nie rozumiem :/

Jeżeli pomogłem, daj + Ciebie nic nie kosztuje Mi znaczy wiele.

 

 

 

 

 

 

 

Zachęcam do podsyłania pomysłów na film jako poradniki na YouTube

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...