Diskuze: Řazení

C# .NET .NET (C# a Visual Basic) Řazení American English version English version

Avatar
Criess
Člen
Avatar
Criess:

Ahoj, potřebuji seřadit jména souborů takto: malá písmena mají přednost před velkými, písmena mají přednost před číslicemi. Nenapadá mě žádný rozumný způsob.

 
Odpovědět 18. listopadu 10:03
Avatar
Odpovídá na Criess
Michal Štěpánek:

Nejsem si jistý, jestli vůbec taková možnost existuje...

Nahoru Odpovědět 18. listopadu 10:12
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Criess
Člen
Avatar
Criess:

No mě napadly dva cykly v sobě a porovnávat ty dva znaky podle hodnoty v ascii, ale to potřebuje dost ifů na ošetření všech možností...

 
Nahoru Odpovědět 18. listopadu 10:31
Avatar
Lukas C#
Redaktor
Avatar
Odpovídá na Criess
Lukas C#:

Vytvoř si svoji vlastní "ASCII" tabulku (asi pole charů), kde budou první malá, poté velká píšmena, a poté číslice. Pak bys asi mohl porovnávat podle pozice v této vlastní tabulce.

 
Nahoru Odpovědět  +3 18. listopadu 11:57
Avatar
Radek Chalupa:

Můžeš použít WinAPI funkci StrCmpC, viz příklad:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace Trideni
{
        class MujComparer : IComparer<string>
        {
                [DllImport("Shlwapi.dll")]
                public static extern int StrCmpC(string s1, string s2);

                public int Compare(string s1, string s2)
                {
                        return StrCmpC(s1, s2);
                }
        };

        class Program
        {
                static void Main(string[] args)
                {
                        MujComparer mc = new MujComparer();
                        List<string> ls = new List<string>();
                        ls.Add("98");
                        ls.Add("abc");
                        ls.Add("ABC");
                        ls.Add("z");
                        ls.Add("12");
                        ls.Add("ZZ");
                        ls.Sort(mc);
                        foreach (string s in ls)
                        {
                                Console.WriteLine(s);
                        }
                        Console.ReadLine();
                }
        }
}

Radek Chalupa

  • individuální konzultace, školení programování (C/C++, C#, WinAPI, .NET Framework, COM, ActiveX, ATL, MFC, ...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět 18. listopadu 13:22
Avatar
Criess
Člen
Avatar
Odpovídá na Lukas C#
Criess:

No, ale jak rychle zjistit, na jakém indexu se znak nachází?

 
Nahoru Odpovědět 19. listopadu 13:26
Avatar
Lukas C#
Redaktor
Avatar
Odpovídá na Criess
Lukas C#:

Není to asi nejúspornější a nejrychlejší, ale vzal bych na to Dictionary. Klíčem je CHAR, hodnotou je nová pozice ve tvojí vlastní code-table.

 
Nahoru Odpovědět  +1 19. listopadu 15:23
Avatar
HONZ4
Člen
Avatar
Odpovídá na Radek Chalupa
HONZ4:

Můžeš použít WinAPI funkci StrCmpC
to nemůže, protože on to chce řadit a,b,c,..A,B,C,­..1,2,3,..

 
Nahoru Odpovědět 19. listopadu 19:49
Avatar
Odpovídá na HONZ4
Radek Chalupa:

Může. Zkoušel jsi to a četl jsi popis té funkce? Řadí podle ASCII tabulky a v té jsou (z těch 3 skupin) nejníž čísla, pak velká písmena a pak malá písmena. A to zda bude mít a-A-1 nebo 1-A-a zvolí prohozením těch parametrů s1 s s2 v metodě Compare.

Radek Chalupa

  • školení programování, konzultace (C/C++, C#, WinAPI, .NET Framework, COM, ActiveX, ATL, MFC, ...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět  +1 19. listopadu 20:16
Avatar
HONZ4
Člen
Avatar
Odpovídá na Radek Chalupa
HONZ4:

on to sice v dotazu neuvedl, ale předpokládám, že mu bude vadit když Z bude níž než A

 
Nahoru Odpovědět 19. listopadu 20:23
Avatar
Odpovídá na HONZ4
Radek Chalupa:

To je pravda. V tom případě si musí poupravit ty názvy před tím než je předhodí tomu compareru, např. změnit malé znaky na velké a naopak a k číslům přidat nějakou hodnotu, aby byla nad malými písmeny.

Radek Chalupa

  • školení programování, konzultace (C/C++, C#, WinAPI, .NET Framework, COM, ActiveX, ATL, MFC, ...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět 19. listopadu 20:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.