• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie alfabetyczne stringa z użyciem pętli

Mały hosting, OGROMNE możliwości
0 głosów
1,627 wizyt
pytanie zadane 1 grudnia 2020 w C# przez Dmianos Nowicjusz (220 p.)

Czy jest jakiś sposób na posortowanie alfabetycznie wyrazu z użyciem pętli i instrukcji warunkowej? Ja spróbowałem czegoś takiego i zwraca mi tą literę która jest faktycznie najwcześniej w alfabecie ale nie wiem jak to dalej pociągnąć, żeby zwróciło cały wyraz posortowany:

static string SortujAlfabetycznie (string tekst)
        {
            char znak = 'h';
            string posortowany = "";       
            for (int j = 0; j < tekst.Length - 1; j++)
            {
                for (int k = 0; k < tekst.Length - 2; k++)
                {
                    if (tekst[k] > tekst[k + 1])
                    {
                        znak = tekst[k + 1];
                    }
                    else
                    {
                        znak = tekst[k];
                    }
                    if (znak > tekst[k + 2])
                    {
                        znak = tekst[k + 2];
                    }
                }
                posortowany += znak;
                break;
                
            }



            return posortowany;
        }

 

komentarz 1 grudnia 2020 przez VBService Ekspert (256,580 p.)
edycja 1 grudnia 2020 przez VBService

Na STACK OVERFLOW w tym temacie (sortowania string-ów): 

Is there a simple way that I can sort characters in a string in alphabetical order

doradzają użycie LINQ, ale rozumiem, że sam chciałeś zaimplementować jakiś algorytm sortowania.

1 odpowiedź

0 głosów
odpowiedź 1 grudnia 2020 przez tangarr Mędrzec (155,140 p.)
Napisz poprawny algorytm sortowania bąbelkowego dla tablicy liczb a potem dostosuj go do sortowania znaków w napisie.
https://pl.wikipedia.org/wiki/Sortowanie_b%C4%85belkowe
komentarz 1 grudnia 2020 przez Dmianos Nowicjusz (220 p.)
o kurcze nie wiedziałem że coś takiego istnieje i ma swoją nazwę, musze o tym poczytać :)
komentarz 1 grudnia 2020 przez Dmianos Nowicjusz (220 p.)

@tangarr, ale zwykłego stringa można tak posortować? Bo widzę, że tylko dla tablic to działa

komentarz 1 grudnia 2020 przez tangarr Mędrzec (155,140 p.)
Napis jest tablicą przechowującą liczby typu char (typ znakowy).
Wystarczy delikatna modyfikacja algorytmu.
komentarz 1 grudnia 2020 przez Dmianos Nowicjusz (220 p.)
if (tekst[k] > tekst[k + 1])
                    {
                        znak = tekst[k];
                        tekst[k] = tekst[k + 1];
                        tekst[k + 1] = znak;


                    }

Wiesz może czemu mi tutaj błąd pokazuje ?

 

komentarz 1 grudnia 2020 przez tangarr Mędrzec (155,140 p.)
Jaki błąd?
Czy zmienna znak jest zdefiniowana?
komentarz 1 grudnia 2020 przez Dmianos Nowicjusz (220 p.)
"nie można przypisać wartości do właściwości lub indeksatora "string.this[int]" - jest on tylko do odczytu"
komentarz 1 grudnia 2020 przez tangarr Mędrzec (155,140 p.)

Wygląda, że w C# nie można w ten sposób modyfikować napisów (tutaj masz dokumentację https://docs.microsoft.com/en-us/dotnet/csharp/how-to/modify-string-contents). Nie wiedziałem o tym.

Zgodnie z dokumentacją musisz przekonwertować swój napis na tablicę char[]

char [] tablica = tekst.ToCharArray();
// sortowanie tablicy tablica
tekst = new string(tablica);

 

komentarz 1 grudnia 2020 przez Dmianos Nowicjusz (220 p.)
Wydaje mi się, że nie mogę korzystać z metod typu .ToCharArray :/

nie ma innego sposobu na posortowanie alfabetycznie z wykorzystaniem pętli ?
komentarz 1 grudnia 2020 przez tangarr Mędrzec (155,140 p.)

You could modify a string in a fixed block with unsafe code, but it is strongly discouraged to modify the string content after a string is created. Doing so will break things in unpredictable ways

Dokumentacja odradza jakiekolwiek próby modyfikacji stworzonego napisu. Prawdopodobnie ma to związek ze sposobem w jaki C# optymalizuje przechowywanie napisów w pamięci (przechowywanie w pamięci tylko jednej kopii napisu i odwoływanie się do niej przy życiu referencji).

Metoda ToCharArray() kopiuje zawartość napisu do tablicy. Możesz sam napisać to kopiowanie w pętli.

char [] tablica = new char [tekst.Length];
for (int i=0 i<tekst.Lenght; i++) 
    tablica[i] = tekst[i];

Podobne pytania

+1 głos
4 odpowiedzi 646 wizyt
pytanie zadane 4 stycznia 2022 w C# przez niezalogowany
+1 głos
1 odpowiedź 981 wizyt
0 głosów
2 odpowiedzi 710 wizyt
pytanie zadane 11 kwietnia 2022 w OpenGL, Unity przez letmestay Użytkownik (520 p.)

93,717 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,262 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...