Czy istnieje macierzysty sposób sortowania ciągu według jego zawartości w języku Java? Na przykład.Sortowanie pojedynczego ciągu znaków w języku Java
String s = "edcba" -> "abcde"
Czy istnieje macierzysty sposób sortowania ciągu według jego zawartości w języku Java? Na przykład.Sortowanie pojedynczego ciągu znaków w języku Java
String s = "edcba" -> "abcde"
toCharArray
następnie Arrays.sort
następnie przez wywołanie konstruktora String:
import java.util.Arrays;
public class Test
{
public static void main(String[] args)
{
String original = "edcba";
char[] chars = original.toCharArray();
Arrays.sort(chars);
String sorted = new String(chars);
System.out.println(sorted);
}
}
EDIT: Jak tackline zwraca uwagę, to się nie powiedzie, jeśli ciąg zawiera zastępczych pary lub znaki rzeczywiście kompozytowe (akcent + E jak oddzielne znaki) itd. W tym momencie robi się o wiele trudniej ... mam nadzieję, że tego nie potrzebujesz :) Ponadto jest to po prostu porządkowanie według porządku, bez uwzględniania wielkich liter, akcentów ani cokolwiek innego.
Nie ma wbudowanej metody String. Można go przekonwertować na tablicę znaków, posortować za pomocą funkcji Arrays.sort i przekonwertować ją z powrotem na ciąg.
String test= "edcba";
char[] ar = test.toCharArray();
Arrays.sort(ar);
String sorted = String.valueOf(ar);
Albo, jeśli chcesz do czynienia właściwie z locale specyficzne rzeczy, jak wielkie i akcentowane znaki:
import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;
public class Test
{
public static void main(String[] args)
{
Collator collator = Collator.getInstance(new Locale("fr", "FR"));
String original = "éDedCBcbAàa";
String[] split = original.split("");
Arrays.sort(split, collator);
String sorted = "";
for (int i = 0; i < split.length; i++)
{
sorted += split[i];
}
System.out.println(sorted); // "aAàbBcCdDeé"
}
}
FYI: ta metoda podzieli 32-bitowe punkty kodu na dwa - znaki Unicode o wartości większej niż 0xFFFF, tworząc ciągi zawierające nieprawidłowe wartości. Nie stanowi problemu dla języka francuskiego, ale może powodować problemy w niektórych lokalizacjach. – McDowell
Zobacz Character.isHighSurrogate (char) – McDowell
Jakoś myślę, że to zrobi ... chyba że chce posortować napisy zawierające słowo suahili lub coś :) – eljenso
String a ="dgfa";
char [] c = a.toCharArray();
Arrays.sort(c);
return new String(c);
Zauważ, że to nie będzie działać zgodnie z oczekiwaniami, jeśli jest to mieszany przypadek Ciąg (umieszcza wielkie litery przed małymi literami). Możesz przekazać komparator do metody Sortowania, aby to zmienić.
potrzebujesz importować java.util.Arrays; inaczej nie zadziała –
Bardziej surowe podejście bez użycia metody sortowania Arrays.sort. Używa sortowania wstawiania.
public static void main(String[] args){
String wordSt="watch";
char[] word=wordSt.toCharArray();
for(int i=0;i<(word.length-1);i++){
for(int j=i+1;j>0;j--){
if(word[j]<word[j-1]){
char temp=word[j-1];
word[j-1]=word[j];
word[j]=temp;
}
}
}
wordSt=String.valueOf(word);
System.out.println(wordSt);
}
pytanie zadawane w języku Native sposób w java, nie używając żadnego innego algorytmu sortowania. –
Poddano głosowanie, ponieważ było to przydatne rozwiązanie, a nie dlatego, że było to wymagane. – Chris
Convert to array of chars → Sort → Convert back to String:
String s = "edcba";
char[] c = s.toCharArray(); //Convert to array of chars
java.util.Arrays.sort(c); //Sort
String newString = new String(c); //Convert back to String
System.out.println(newString); //Will print "abcde"
W Javie 8 mogą być wykonane z:
String s = "edcba".chars()
.sorted()
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
nieco krótszą alternatywę, która działa strumieniem ciągi o długości jednego (każdy znak w niesortowanym ciągu jest konwertowany na ciąg w strumieniu) to:
String sorted =
Stream.of("edcba".split(""))
.sorted()
.collect(Collectors.joining());
Procedura:
Fragment kodu:
String input = "world";
char[] arr = input.toCharArray();
Arrays.sort(arr);
String sorted = new String(arr);
System.out.println(sorted);
public static void main(String[] args) {
String str = "helloword";
char[] arr;
List<Character> l = new ArrayList<Character>();
for (int i = 0; i < str.length(); i++) {
arr = str.toCharArray();
l.add(arr[i]);
}
Collections.sort(l);
str = l.toString();
System.out.println(str);
str = str.replaceAll("\\[", "").replaceAll("\\]", "")
.replaceAll("[,]", "");
System.out.println(str);
}
Bez użycia Kolekcje w Javie:
import java.util.Scanner;
public class SortingaString {
public static String Sort(String s1)
{
char ch[]=s1.toCharArray();
String res=" ";
for(int i=0; i<ch.length ; i++)
{
for(int j=i+1;j<ch.length; j++)
{
if(ch[i]>=ch[j])
{
char m=ch[i];
ch[i]=ch[j];
ch[j]=m;
}
}
res=res+ch[i];
}
return res;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("enter the string");
String s1=sc.next();
String ans=Sort(s1);
System.out.println("after sorting=="+ans);
}
}
wyjściowa:
wprowadź ciąg ==
sortowania
po sortowaniu == ginorst
Poprawnym sposobem byłoby sortowanie punktów kodowych. Niestety nie ma String.toCodePointArray. (W jakiej kolejności należy sortować, btw?) –
Projekt ICU opisuje metodę sortowania UTF-16 w kolejności punktów kodowych: http://icu-project.org/docs/papers/utf16_code_point_order.html. Nie sądzę, aby Arrays.sort zniszczył jakiekolwiek dodatkowe znaki ze względu na sposób definiowania zakresów, ale nie cytuj mnie. – McDowell
Może nie zniszczy niczego, ale kolejność sortowania nie jest optymalna, jeśli chcesz wziąć pod uwagę wielkie litery i akcenty na przykład. Algorytm ten będzie sortował "éDedCBcbAàa" jako "ABCDabcdeàé", podczas gdy, na przykład, w języku angielskim (US), bardziej pożądane byłoby uzyskanie "aAàbBcCdDeé". – eljenso