Sum of Digits

NickNick

Neues Mitglied
Hallo, hat jemand eine einfache Lösung für diese Aufgabenstellung?:

Ein beliebiger String soll eingelesen werden, nach dem Einlesen ermittelt der Algorithmus die Summe der im String enthaltenen Ziffern und gibt diese aus.

Beispiel
Input: abc565xyz
Output: 16

Vielen Dank!
 
K

kneitzel

Gast
Du könntest alle Zeichen, welche keine Zahlen sind mit whitespace ersetzen und dann Zahl für Zahl in einen Int umwandeln und addieren ;)
Wozu umwandeln? Du musst ja einzeln durchgehen und da kannst du dann auch für jedes Zeichen schauen, ob es eine Ziffer ist. Aber das ist auch nicht notwendig - Tobias hat schon eine kurze Lösung gebracht, die für eine erste Version schon top ist. Unit-Test ist ok, also alles super :)
 

NickNick

Neues Mitglied
also ich hätte nur den code für die ziffernsumme:

import java.util.Scanner;

public class SumofDigits {

public static void main(String[] args) {

int zahl = 0;

Scanner input = new Scanner(System.in);
System.out.println("Input: ");
zahl = input.nextInt();

int summe;
int ziffer;

summe = 0;

while (zahl > 0) {

ziffer = zahl % 10;

summe = summe + ziffer;
zahl = zahl / 10;
}

System.out.println("Output: " + summe);

}
}
 
K

kneitzel

Gast
Wenn du einen String hast:
- kennst du einen Weg, um da die einzelnen Zeichen zu kommen?
- Zeichen sind streng genommen auch nur Zahlen. Daher kannst Du Zeichen auch mit > und < vergleichen. Du kannst also prüfen, ob der Wert zwischen den Zeichen ‚0‘ und ‚9‘ ist.

Damit könntest du dann einen Algorithmus ähnlich dem gezeigten Schreiben.
 
X

Xyz1

Gast
Machen wir es schnell
Java:
	public static int sumOfDigits(String s) {
		return s.chars().filter(Character::isDigit).reduce(0, (i0, i1) -> i0 + Character.digit(i1, 10));
	}

Character.digit() ist natürlich nicht so schön, vielleicht fällt da noch jemandem etwas ein. ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Machen wir es schnell
Java:
    public static int sumOfDigits(String s) {
        return s.chars().filter(Character::isDigit).reduce(0, (i0, i1) -> i0 + Character.digit(i1, 10));
    }

Character.digit() ist natürlich nicht so schön, vielleicht fällt da noch jemandem etwas ein. ;)
Nimm map+sum anstatt reduce, dann sieht das auch mit digit deutlich schöner aus.
 
X

Xyz1

Gast
Du meinst das so oder? Gefällt mir aber auch nicht.
Java:
	public static int sumOfDigits(String s) {
		return s.chars().filter(Character::isDigit).mapToObj(a -> a - '0').reduce(0, (a, b) -> a + b);
	}
 
X

Xyz1

Gast
Oder so? (Dann ist aber immernoch Character.digit(a, 10) dabei)
Java:
	public static int sumOfDigits(String s) {
		return s.chars().filter(Character::isDigit).mapToObj(a -> Character.digit(a, 10)).reduce(0, Integer::sum);
	}

Streams sind kacke :D
 
X

Xyz1

Gast
Sorry, so: return s.chars().filter(Character::isDigit).map(a -> Character.digit(a, 10)).sum();
 

X5-599

Top Contributor
Nichts für ungut, aber da es sich um eine Übungsaufgabe handelt, würde ich sagen ein Lösungsweg bei dem man auch "sieht" was passiert wäre hier vorzuziehen. Dafür wäre es auch hilfreich wenn man wüsste, ob (oder besser: welche) Klassen aus der Java Bibiothek benutzt werden dürfen.
 

X5-599

Top Contributor
Geschmäcker sind halt verschieden. Ich werde mich niemals mit diesen Streams/Lambdas/Methoden Referenzen etc anfreunden können.
 
K

kneitzel

Gast
Ja, hier im Thread ist eine Anfänger freundliche Lösung gesucht, aber dennoch finde ich Streams bei gewissen Dingen durchaus sehr nützlich. Zum einen bieten sie bei manchen Aufgaben die Möglichkeit, etwas sehr kurz und präzise zu formulieren und zum anderen sehe ich den großen Vorteil der einfachen Parallelisierung.

Und den Code:
Java:
return s.chars()
    .filter(Character::isDigit)
    .map(a -> Character.digit(a, 10))
    .sum();
finde ich nicht wirklich schlecht zu lesen und entspricht auch dem typischen vorgehen, das man oft hat.
Irgendwas als Stream nehmen, filtern, ggf. verarbeiten (map) und dann Ergebnis bauen (hier sum, aber öfter halt eine Collection bauen).

Ich sah das früher ähnlich wie @X5-599 aber wenn man sich etwas mehr damit beschäftigt hat, dann hat man sehr schnell ein paar Standard-Szenarien, wo das wirklich schön und gut ist. Vor allem, wenn man in der Verarbeitung keinen State hat, den man verändert so wie hier, denn da macht dann eine Parallelisierung viel Sinn:
Java:
return s.chars().parallel()
    .filter(Character::isDigit)
    .map(a -> Character.digit(a, 10))
    .sum();

Das ist halt in der Praxis ein Vorteil, den ich sehe.
 

temi

Top Contributor
aber dennoch finde ich Streams bei gewissen Dingen durchaus sehr nützlich. Zum einen bieten sie bei manchen Aufgaben die Möglichkeit, etwas sehr kurz und präzise zu formulieren und zum anderen sehe ich den großen Vorteil der einfachen Parallelisierung.
Da bin ich völlig bei dir. Und es ist durchaus auch legitim eine solche Lösung zu zeigen, wobei evtl. vorher versucht werden sollte, dem Hilfesuchenden*, einen für ihn passenden Weg zu weisen, bevor man ihm damit erschlägt, was noch alles möglich ist. Zumindest ein Hinweis, wäre nett, dass die gezeigte Lösung noch nicht dem vorhandenen Wissensstand entspricht.

Immerhin ist das hier ein Forum, das helfen möchte und nicht das "confuse a cat"-Forum.
 
Zuletzt bearbeitet:

Neue Themen


Oben