[java] Jak w Stringu oddzielić liczby od tekstu?


#1

Witam,

mam pytanie:

w zmiennej String abc mam taki ciąg znaków: "0a2". Chciałbym zapisać każdy znak do oddzielnej zmiennej to znaczy żeby "0" było w zmiennej "int a", litera "a" była w zmiennej "String b" itd. Da się coś takiego zrobić?

Z góry dzięki!


(Sawyer47) #2

Z góry wiadomo, że teksty będą jednoliterowe? Znany jest z góry jakiś format tego napisu, który chcesz rozdzielać? Gdyby np. tekst zawsze był w formacie cyfra-liera-cyfra to nie ma problemu

String abc = "0a2";

int a = Character.digit(abc.charAt(0), 10);

String b = abc.substring(1, 2);

int c = Character.digit(abc.charAt(2), 10);

Jeśli format nie jest znany to musiałbyś zapisywać do tablic/list int-ów/String-ów. Jeśli napisy/cyfry mogą być wieloliterowe to musiałbyś obliczać odpowiednio argumenty dla substring a wartości liczb obliczać np. za pomocą Integer.parseInt(String).


(Marcin E Pc) #3

Ja bym proponował pokombinować ze StreamTokenizer-em. Co prawda wychodzi z użycia, ale to najlepsze co mi się udało wymyśleć. Przy użyciu tego, będziesz mógł ze Stringa po kolei wyłuskać wszystkie liczby niezależnie od sługości ciągu.

Pozdrawiam


Edit:

A nawet łatwiej:

package tests;


public class Runner 

{

	public static void main(String[] args)

	{

		String abc = "1t2bg3";

		for(int i=0;i
		{

			if(Character.isDigit(abc.charAt(i)))

				System.out.println(abc.charAt(i));

		}

	}

}

Mam nadzieję że z resztą już dasz sobie rade.


#4

Sorry, że odkopuję temat, ale mam jeszcze jedno pytanie z nim związane.

Mianowicie:

tym razem w Stringu mam coś takiego:

v -11.785661 1.532853 -2.402584

v -1.785662 1.532853 -2.402582

v 3.214337 1.532853 7.597418

Tutaj z każdej linijki muszę odczytać literę oraz trzy liczby.

Czego dokładnie nie wiem:

  1. jak odczytać liczby skoro nie znam ich długości

  2. jak przeskoczyć na drugi wiersz gdy odczytałem już pierwszy? EDIT pytanie nie ważne bo podejrzewam że stringi i tak to wszystko w jednym ciągu trzymają

Mógłbym to zrobić tak jak kolega ptasior pokazał. Mógłbym po prostu sprawdzać gdzie są spacje dzięki czemu oddzieliłbym wszystkie liczby i litery. Lecz nadal nie wiem jak odzyskać same liczby.

Z góry dzięki!


(Grzelix) #5

radzę poczytać trochę o wyrażeniach regularnych (regex) bardzo potężne narzędzie

o taki kod pobierze twoje liczby z pojedynczej linijki:

String s = "v -11.785661 1.532853 -2.402584";

        Pattern pat = Pattern.compile("-?[0-9]+\\.[0-9]+");

        Matcher mat = pat.matcher(s);


        while (mat.find()) {

            System.out.println("Match: " + mat.group());

        }

#6

A czy jest możliwość odczytania liczb od miejsca do miejsca? Tzn. chciałbym odczytać wszystkie liczby od znaku powiedzmy pierwszego(tj. "v") do np znaku czterdzistego pierwszego (tj. np. "q"). I program od tego miejsca do wskazanego będzie odczytywał liczby.


(Grzelix) #7

więc wpierw przytnij linię do 41 znaków i wyszukaj liczby

czyli

String s = "v -11.785661 1.532853 -2.402584";

s =s.substring(0,41); //tutaj sprawdź bo piszse z palca mogę coś przekręcić w parametrach funkcji.

Pattern pat = Pattern.compile("-?[0-9]+\\.[0-9]+");

        Matcher mat = pat.matcher(s);


        while (mat.find()) {

            System.out.println("Match: " + mat.group());

        }

#8

Jeszcze do tego takie proste pytanie:

chciałbym sprawdzić czy String zawiera liczby od "0" do "9", kropkę, przcinek itd. Czy da się to zapytanie jakoś zamieścić w jednym if'ie?

Na czy znam formę taką:

if(zmienna == zmienna || zmienna == zmienna)

i tak dalej, ale ja chciałbym to mieć w jak najkrótszej formie, bo tych znaków będzie trochę.


(Grzelix) #9

napisałem Ci w jednym poście abyś poczytał o wyrażeniach reguralnych a skoro piszesz w javie to najlepiej żebyś zrobił to pod kątem tego języka.

na ostanie pytanie masz gotową odpowiedż w potrzednich postach.

Wzorzec:

Pattern pat = Pattern.compile("-?[0-9]+\\.[0-9]+");

wyszukje w zadanym stringu podciąg który na początku może mieć znak '-' (część '-?') następnie ciąg cyfr z przedziału 0-9 co najmniej raz ([0-9]+) następnie kropkę ('\.') i potem co najmniej jedną cyfrę z przedziału 0-9. natomiast fragment

mat.find()

zwraca wartość boolowską czyli mówi czy taki podciąg istnieje w danym stringu czy nie.

więc zamist while dajesz if i masz sprawdzenie czy występuje dany wzorzec w zadanym stringu.


#10

Ostatnie pytanie:

jest możliwość żeby to: mat.group() zwracało int, a nie String?


(Grzelix) #11

wyszukujesz podciągu a zadanym wzorcu więc rezultatem jest string.

I rozumiem że nie wiesz jak zamienić string na int (choć w przykładach podawałeś raczej double) ?

int a = Integer.parseInt(s);