Mam liczby takie jak 1100, 1002, 1022 itd. Chciałbym mieć poszczególne cyfry, na przykład dla pierwszej liczby 1100 chcę mieć 1, 1, 0, 0.
Jak mogę to uzyskać w Javie?
Aby to zrobić, użyjesz %
operatora (mod).
int number; // = some int
while (number > 0) {
print( number % 10);
number = number / 10;
}
Operator mod da ci resztę z dzielenia int na liczbie.
Więc,
10012 % 10 = 2
Ponieważ:
10012 / 10 = 1001, remainder 2
Uwaga: jak zauważył Paul, da ci to liczby w odwrotnej kolejności. Będziesz musiał włożyć je na stos i zdjąć w odwrotnej kolejności.
Kod do wydrukowania liczb we właściwej kolejności:
int number; // = and int
LinkedList<Integer> stack = new LinkedList<Integer>();
while (number > 0) {
stack.push( number % 10 );
number = number / 10;
}
while (!stack.isEmpty()) {
print(stack.pop());
}
Przekonwertuj go na
String
i użyjString#toCharArray()
lubString#split()
.Jeśli jesteś już na Javie 8 i chcesz później wykonać na niej zagregowane operacje, rozważ użycie,
String#chars()
aby wyjśćIntStream
z tego.źródło
split("")
przypadku pierwszym elementem tablicy jest""
. Użyj innego wyrażenia regularnego, na przykładsplit("(?<=.)")
.number.chars()
zwróci wynik w postaci wartości Ascii, a nie liczb. Dzięki temu liczba „1234” zostanie podzielona na „49”, „50”, „51”, „52” zamiast „1”, „2”, „3”, „4”. Aby zrobić to dobrze, powinno wyglądać następująco:IntStream chars = number.chars().map(Character::getNumericValue);
Co powiesz na to?
lub zamiast drukować na konsolę, możemy zebrać ją w tablicy liczb całkowitych, a następnie wydrukować tablicę:
Jeśli chcesz zachować kolejność cyfr od najmniej znaczących (indeks [0]) do najbardziej znaczących (indeks [n]), potrzebujesz zaktualizowanej metody getDigits ():
źródło
+1
+1
if (number < 0) { return new Integer[0]; }
Testowane z następujących wejść:Integer[] samples = {11111, 123457, 0, -13334, 93846, 87892, 9876543, -1234, 012455};
Nie widziałem nikogo używającego tej metody, ale zadziałała i jest krótka i słodka:
Spowoduje to:
źródło
0142323
jest stałą ósemkową równą50387
ze względu na wiodące zero, podobnie jak0x100
stała szesnastkowa równa256
, ze względu na interlinię0x
, i0b1011
jest stałą binarną równą ze11
względu na interlinię0b
. Uważaj na początkowe zera w stałych całkowitych!Zauważyłem, że jest kilka przykładów wykorzystania strumienia Java 8 do rozwiązania problemu, ale myślę, że ten jest najprostszy:
Dla jasności: używasz
String.valueOf(number)
do konwersji int na String, a następniechars()
metody, aby uzyskać IntStream (każdy znak z twojego ciągu jest teraz liczbą Ascii), a następnie musisz uruchomićmap()
metodę, aby uzyskać wartości liczbowe liczby Ascii. Na koniec używasztoArray()
metody, aby zmienić swój strumień na tablicę int [].źródło
Widzę, że wszystkie odpowiedzi są brzydkie i niezbyt czyste.
Proponuję użyć odrobiny rekursji, aby rozwiązać problem. Ten post jest bardzo stary, ale może być pomocny dla przyszłych programistów.
Wynik:
źródło
źródło
Myślę, że łatwiejszym sposobem jest przekonwertowanie liczby na ciąg i użycie
substring
do wyodrębnienia, a następnie przekonwertowania na liczbę całkowitą.Coś takiego:
ouput jest 2014
źródło
Napisałem program, który pokazuje, jak oddzielać cyfry w liczbie całkowitej, używając prostszego i bardziej zrozumiałego podejścia, które nie obejmuje tablic, rekurencji i całej tej fantazyjnej schmanii. Oto mój kod:
Załóżmy, że dane wejściowe to liczba całkowita
123
, a wynikowe dane wyjściowe będą następujące:źródło
Oto moja odpowiedź, zrobiłem to dla siebie i mam nadzieję, że jest to dość proste dla tych, którzy nie chcą używać metody String lub potrzebują bardziej matematycznego rozwiązania:
Więc po prostu pobieram jednostki, drukuję je, odejmuję od liczby, a następnie dzielę tę liczbę przez 10 - co jest zawsze bez żadnych elementów pływających, ponieważ jednostki zniknęły, powtórz.
źródło
proste rozwiązanie
źródło
Spróbuj tego:
Otrzymasz pierwszy = 1, drugi = 2, trzeci = 3 i czwarty = 4 ....
źródło
%
. Dodaje niewielkiej wartości.Rozwiązanie Java 8 do pobierania cyfr jako int [] z liczby całkowitej, którą masz jako ciąg:
źródło
i -> i - '0'
dodając mapowanie, aby wynik był dokładnie taki, o jaki prosił OP.i - '0'
istnieją również metody takie jakCharacter.toDigit
ta IMO, które są lepsze w użyciu."0123456789".chars().map(i -> Character.digit(i, 10)).toArray()
Znak # cyfra (jest jeden dla znaku i jeden dla punktów kodu int)ani
chars()
anicodePoints()
- druga lambdaString number = Integer.toString( 1100 );
źródło
Java 9 wprowadziła nową
Stream.iterate
metodę, której można użyć do wygenerowania strumienia i zatrzymania się w określonym stanie. Można to wykorzystać do uzyskania wszystkich cyfr w numerze, stosując podejście modulo.Zwróć uwagę, że spowoduje to wyświetlenie cyfr w odwrotnej kolejności, ale można to rozwiązać albo przez zapętlenie tablicy do tyłu (niestety odwrócenie tablicy nie jest takie proste ) lub przez utworzenie innego strumienia:
lub
Na przykład ten kod:
Wydrukuje:
źródło
Integer.toString (1100) podaje liczbę całkowitą jako ciąg. Integer.toString (1100) .getBytes (), aby uzyskać tablicę bajtów poszczególnych cyfr.
Edytować:
Możesz zamienić cyfry znaku na cyfry, w ten sposób:
źródło
'1'
lub'0'
. Wartości bajtów nie będą1
, lub0
.Używa metody modulo 10, aby obliczyć każdą cyfrę w liczbie większej niż 0, a następnie odwróci kolejność tablicy. Zakłada się, że nie używasz „0” jako cyfry początkowej.
Jest to modyfikowane, aby uwzględnić dane wejściowe użytkownika. Ta tablica jest pierwotnie wstawiana od tyłu, więc musiałem użyć
Collections.reverse()
wywołania, aby przywrócić ją do kolejności użytkownika.źródło
Aby rozwinąć ten temat, oto jak potwierdzić, że liczba jest palindromiczną liczbą całkowitą w Javie:
Jestem pewien, że mogę jeszcze bardziej uprościć ten algorytm. A jednak to jest miejsce, w którym jestem. I zadziałało we wszystkich moich przypadkach testowych.
Mam nadzieję, że to komuś pomoże.
źródło
źródło
źródło
zobacz poniżej moją propozycję z komentarzami
źródło
Coś takiego zwróci
char[]
:źródło
Jako noob, moja odpowiedź brzmiałaby:
Teraz wszystkie cyfry są zawarte w tablicy „digits”.
źródło
Dlaczego nie robisz:
źródło
Ponieważ nie widzę metody w tym pytaniu, która wykorzystuje Javę 8, dorzucę to. Zakładając, że zaczynasz od a
String
i chcesz otrzymać aList<Integer>
, możesz strumieniować elementy w ten sposób.Spowoduje to pobranie znaków w
String
as aIntStream
, odwzorowanie tych reprezentacji całkowitych znaków na wartość liczbową, umieszczenie ich w ramce, a następnie zebranie ich na liście.źródło
Collectors.toList()
→ " Niezgodność typu: nie można przekonwertować z Collector <Object, capture # 3-of?, List <Object>> do Supplier <R> ",collect
→ " Metoda collect (Supplier <R>, ObjIntConsumer <R >, BiConsumer <R, R>) w typie IntStream nie ma zastosowania dla argumentów (Collector <Object,?, List <Object>>) "Myślę, że będzie to najbardziej przydatny sposób na zdobycie cyfr:
Następnie możesz uzyskać cyfry w prosty sposób:
lub prościej:
Zwróć uwagę, że ostatnia metoda wywołuje metodę getDigitsOf zbyt długo. Więc będzie wolniej. Powinieneś utworzyć tablicę int, a następnie raz wywołać metodę getDigitsOf, tak jak w drugim bloku kodu.
W poniższym kodzie możesz cofnąć proces. Ten kod łączy wszystkie cyfry, aby utworzyć numer:
Obie podane przeze mnie metody działają również dla liczb ujemnych.
źródło
źródło
w Javie w ten sposób można oddzielić cyfry od liczb i przechowywać je w tablicy.
Wynik:
źródło
jeśli cyfra ma być
Character
źródło
Pattern.compile
? To duża przesada.Bez używania tablic i ciągów znaków. (cyfry 1-99999)
wynik :
Wprowadź cyfrę do wydrukowania oddzielnie: - 12345
1 2 3 4 5
źródło
divider
.