2013-03-06 21 views
29

Próbuję pobrać trzy ostatnie znaki dowolnego ciągu i zapisać go jako inną zmienną String. Mam ciężki czas z moim myśleniem.Pobierz ostatnie trzy znaki z dowolnego ciągu znaków - Java

String word = "onetwotwoone" 
int length = word.length(); 
String new_word = id.getChars(length-3, length, buffer, index); 

Nie wiem, jak użyć metody getChars, jeśli chodzi o bufor lub indeks. Eclipse sprawia, że ​​mam tam tych. Jakieś sugestie?

+0

Bufor to "char []", w którym występują znaki, a indeksem jest początek tej tablicy, w której chcesz rozpocząć kopiowanie. Po prostu stwórz char [] o rozmiarze 3 i ustaw indeks na 0. Chociaż podciąg prawdopodobnie byłby lepszy –

+0

zgadzam się z mark konwertować na char [] (String.toCharArray(), a następnie wydrukować ostatnie 3) – amitmah

Odpowiedz

106

Dlaczego nie tylko String substr = word.substring(word.length() - 3)?

Aktualizacja

proszę pamiętaj, aby sprawdzić, że String wynosi co najmniej 3 znaki długo przed wywołaniem substring():

if (word.length() == 3) { 
    return word; 
} else if (word.length() > 3) { 
    return word.substring(word.length() - 3); 
} else { 
    // whatever is appropriate in this case 
    throw new IllegalArgumentException("word has less than 3 characters!"); 
} 
+0

Może być ostrożny z ciągami z mniej niż trzema znakami, myślę, że ujemne dane wejściowe zwrócą pierwotny ciąg znaków (może być źle o tym), co może, ale nie musi być akceptowalne dla tego, co próbują osiągnąć. – celestialorb

+1

@celestialorb: indeks wykluczający spowoduje wyjątek, zgodnie z [the docs] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int%29). – MvG

+0

@celestialorb, Dzięki za wzmiankę, w każdym razie początkowy kod z pytania również musi obsługiwać wyjątki, więc nie myślałem o tym problemie. – Egor

1

String newString = originalString.substring(originalString.length()-3);

+0

@MvG: Zaktualizowana odpowiedź.Tak był literówka – Cratylus

0

Sposób getChars łańcuch nie zwraca wartości zamiast tego zrzuca swój wynik do twojej tablicy buforów (lub docelowych). Parametr indeksu opisuje przesunięcie początkowe w macierzy docelowej.

Wypróbuj ten link, aby uzyskać bardziej szczegółowy opis metody getChars.

Zgadzam się z innymi na ten temat, myślę, że podciągu byłoby lepszym sposobem radzenia sobie z tym, co próbujesz osiągnąć.

0

Można użyć podciąg

String word = "onetwotwoone" 
int lenght = word.length 
String numbers = word.substring(word.length() - 3); 
+0

powinien to być 'word.length()' – Shardul

3
public String getLastThree(String myString) { 
    if(myString.length() > 3) 
     return myString.substring(myString.length()-3); 
    else 
     return myString; 
} 
1

Jeśli chcesz String złożoną z trzech ostatnich znaków, można użyć substring(int):

String new_word = word.substring(word.length() - 3); 

Jeśli rzeczywiście chcesz je jako tablica znaków, należy napisać:

Pierwsze dwa argumenty dla getChars oznaczają część ciągu, który chcesz wyodrębnić. Trzecim argumentem jest tablica, w której zostanie umieszczona ta część. Ostatni argument podaje pozycję w buforze, w którym rozpoczyna się operacja.

Jeśli ciąg ma mniej niż trzy znaki, w jednym z powyższych przypadków uzyskasz wyjątek, więc możesz to sprawdzić.

12

Oto niektóre zwięzły kod, który spełnia swoje zadanie przy użyciu regex:

String last3 = str.replaceAll(".*?(.?.?.?)?$", "$1"); 

Ten kod zwraca do 3; jeśli jest mniej niż 3, po prostu zwraca ciąg znaków.

To jak to zrobić bezpiecznie bez regex w jednym wierszu:

String last3 = str == null || str.length() < 3 ? 
    str : str.substring(str.length() - 3); 

Przez „bezpiecznie”, to znaczy bez rzuca wyjątek, jeśli ciąg jest null lub krótszy niż 3 znaki (cały inne odpowiedzi nie są "bezpieczne").


Powyższy kod jest identyczny w efekcie do tego kodu, jeśli wolisz bardziej rozwlekły, ale potencjalnie łatwiejsze do odczytania postać:

String last3; 
if (str == null || str.length() < 3) { 
    last3 = str; 
} else { 
    last3 = str.substring(str.length() - 3); 
} 
+0

Możliwe, ale dość trudne do zrozumienia ze swoim potrójnym operatorem i brakiem nawiasów. Więc odradzam to tutaj. -1. – MvG

+1

@MvG, więc ta odpowiedź jest "nie pomocna"? (To właśnie oznacza "-1 głos"). Dlaczego użycie trójskładnikowej składni nie jest pomocne? A gdzie byś umieścił nawiasy? Wręcz przeciwnie, myślę, że ta odpowiedź jest pomocna, szczególnie biorąc pod uwagę, że wszystkie inne wybuchłyby, gdyby przekazano im wartość zerową lub krótki sygnał wejściowy. – Bohemian

+0

Nie jest to pomocne, ponieważ uważam (przepraszam, jeśli się mylę), że większość użytkowników, którzy zmagają się z wyodrębnianiem podciągu z danego ciągu, będzie na swój sposób próbować odczytać kod. Sprawdzanie długości jest bardzo w porządku, ale na tym poziomie uważam, że bardziej rozwlekłe rozwiązania są pomocne, a tajemnicze rozwiązania tylko mylące. Co do nawiasów: Napisałem to: "... = ((... || ...)? ...: ...)". Dodany przez ciebie owijacz linii sprawia, że ​​rzeczy są o wiele lepsze. – MvG

6

uważam right metodę z StringUtils klasy z Apache Commons Lang: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#right(java.lang.String,%20int)

Jest bezpieczny. Nie dostaniesz NullPointerException ani StringIndexOutOfBoundsException.

Przykład użycia:

StringUtils.right("abcdef", 3)

Można znaleźć więcej przykładów pod powyższym linkiem.

+0

W Androidzie ta funkcja nie istnieje – Pranaysharma

+2

To powinna być poprawna odpowiedź! – hackingforgirls

Powiązane problemy