2009-03-03 19 views

Odpowiedz

174

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.

+2

Poprawnym sposobem byłoby sortowanie punktów kodowych. Niestety nie ma String.toCodePointArray. (W jakiej kolejności należy sortować, btw?) –

+1

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

+1

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

46

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é" 
    } 
} 
+0

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

+0

Zobacz Character.isHighSurrogate (char) – McDowell

+1

Jakoś myślę, że to zrobi ... chyba że chce posortować napisy zawierające słowo suahili lub coś :) – eljenso

14
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ć.

+1

potrzebujesz importować java.util.Arrays; inaczej nie zadziała –

12

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); 
} 
+1

pytanie zadawane w języku Native sposób w java, nie używając żadnego innego algorytmu sortowania. –

+1

Poddano głosowanie, ponieważ było to przydatne rozwiązanie, a nie dlatego, że było to wymagane. – Chris

23

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()); 
5

Procedura:

  1. Początkowo przekonwertować ciąg do tablicy char
  2. Następnie posortować tablicę charakteru
  3. Konwersja tablicy znakowy ciąg
  4. wydrukować ciąg

Fragment kodu:

String input = "world"; 
    char[] arr = input.toCharArray(); 
    Arrays.sort(arr); 
    String sorted = new String(arr); 
    System.out.println(sorted); 
0
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); 

} 
0

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

Powiązane problemy