# Erst Buchstabe Groß



## dg87 (9. Juli 2013)

Moin,

gibt es eine Möglichkeit einen String so zu bauen, dass alle Buchstaben bis auf der erste klein sind?
Hab nämlich hier Strings die so aussehen: MÜnchen, BErlin etc.
Können auch aus zwei Wörter bestehen.

Also meine Idee wäre, erstmal alles klein zu machen und dann den ersten groß, aber wie?


----------



## sheel (9. Juli 2013)

Hi

geht effizienter, aber zB.

```
str = str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();
```
Vorausgesetzt, der String hat genug Buchstaben,
um zwischen Erstem und Rest unerscheiden zu können.


----------



## dg87 (9. Juli 2013)

Ich werde das mal ausprobieren, dachte ich muss reguläre Expressions benutzen.
Kann halt sein dass es auch sowas wie Bad Endorf gibt, wo ein Ort aus zwei Wörtern besteht


----------



## MiMi (9. Juli 2013)

Dann kannst du es noch splitten auf Leerzeichen und die einzelnen Strings dann mit der Methode von sheel umwandeln


----------



## dg87 (9. Juli 2013)

Hmm ja ich werde jetzt erst einmal das Beispiel von oben nehmen, hab auch gegooglt, das ist wohl am besten.
Problem ist, man kann hierfür keine feste Regel für die Orte nehmen. Es gibt ja auch zB.:
Losheim am See. Würde ich splitten und alle groß machen, sieht es ja dann so aus:
Losheim Am See. Das möchte ich auch nicht.

Das Hauptproblem bei mir war einfach, dass durch eine externe XML Städte kommen wie MÜnchen, oder KÖln. Und das ist wirklich nicht schön und mit der oben genannten Zeilte von sheel bekomm ich das am schönsten weg.
Also brauch ich gar ned splitten im Endeffekt..


----------



## MiMi (9. Juli 2013)

Mit der Zeile von oben bekommst du aber auch bei Strings mit mehreren Wörtern dein Problem nicht gelöst, deswegen das split was ich vorgeschlagen hab.
Nutz du die Zeile oben ohne split wird aus 
LOsheim am SEe --> Losheim am see
BAd ENdorf --> Bad endorf

Es nimmt halt von dem kompletten String immer den ersten Buchstaben, macht den gross und den Rest klein


----------



## Bratkartoffel (9. Juli 2013)

Hi,

mir war grad langweilig, wie findest du diese Lösung?

```
package de.tutorials.bk;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
	private static final List<String> input = Arrays.asList(
			"ESseN",
			"MÜnChen",
			"BAD ENDoRF",
			"a",
			null,
			"NeuBurG am inn",
			"NeUKIrchen vorm waLd",
			"passau"
	);

	private static final List<String> ignore = Arrays.asList(
			"in",
			"am",
			"an",
			"der",
			"vor",
			"vorm"
	);

	public static void main(String[] args) {
		new Test().work();
	}

	public void work() {

		// Ausgabe vor der Umwanldung
		System.out.println("Vorher:");
		print(input);

		// Zweite Liste mit Ergebnis vorbereiten
		List<String> output = new ArrayList<String>();
		for (String str : input) {
			// Ergebnis in neue Liste schreiben
			output.add(ucWords(str));
		}

		// Alle Daten abgearbeitet, wieder ausgeben
		System.out.println("Nachher:");
		print(output);
	}

	private void print(List<String> daten) {
		// Trenner ausgeben
		System.out.println("===================");

		// Alle Strings der Liste ausgeben
		for (String str : daten) {
			System.out.println(str);
		}

		// Abschließend eine Leerzeile
		System.out.println();
	}

	private String ucWords(String sentence) {
		// NPE abfangen
		if (sentence == null) {
			return null;
		}

		// erst in kleinbuchstaben ändern und unnötige spaces entfernen
		String str = sentence.trim().toLowerCase();

		// dann in worte aufteilen
		String[] words = str.split("\\s");

		// Puffer für Ergebnis vorbereiten
		StringBuilder result = new StringBuilder();

		// Alle Worte durchlaufen
		for (String word : words) {
			// Wort ignorieren?
			if(ignore.contains(word)) {
				result.append(word);
			} else {
				// Ersten Buchstaben immer groß
				result.append(Character.toUpperCase(word.charAt(0)));

				// Den Rest (falls vorhanden) ohne Änderung übernehmen
				if (word.length() > 1) {
					result.append(word.substring(1));
				}
			}

			// Wort abgeschlossen, Leerzeichen hinzufügen
			result.append(' ');
		}

		// Das letzte, nicht mehr benötigte Leerzeichen wieder entfernen
		if (result.length() > 0) {
			result.setLength(result.length() - 1);
		}

		// Ergebnis zurückgeben
		return result.toString();
	}
}
```

Ausgabe:

```
Vorher:
===================
ESseN
MÜnChen
BAD ENDoRF
a
null
NeuBurG am inn
NeUKIrchen vorm waLd
passau

Nachher:
===================
Essen
München
Bad Endorf
A
null
Neuburg am Inn
Neukirchen vorm Wald
Passau
```

Grüße,
BK


----------



## dg87 (9. Juli 2013)

Das ist natürlich die beste Lösung 
Danke dir.


----------

