• 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

Object Storage Arubacloud
0 głosów
931 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 (253,280 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 (154,860 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 (154,860 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 (154,860 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 (154,860 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 (154,860 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 303 wizyt
pytanie zadane 4 stycznia 2022 w C# przez niezalogowany
+1 głos
1 odpowiedź 591 wizyt
0 głosów
2 odpowiedzi 272 wizyt
pytanie zadane 11 kwietnia 2022 w OpenGL, Unity przez letmestay Użytkownik (520 p.)

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

61,954 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...