Miként lehetne ezt a rendezést megcsinálni?
Adott egy lista tele szavakkal, amiben minden szó csak 1x fordul elő, de előfordulhatnak benne egymásnak anagrammák. A feladat az, hogy rendezzem úgy hogy szóhossz szerint csökkenő sorrendbe, hogy legelőszőr a egymásnak anagrammák és ugyanolyan hosszú szavak, ezután a nem anagrammák, de ugyan olyan hosszú szavak végül pedig azok amiknek nincs anagrammájuk. Az meg van, hogy eldöntsem, hogy anagramma--e azzal nincs gond, csupán a rendezéssel. A IComparable interfésszel próbáltam meg oldani, de nem teljesen jó. Tehát aminek egyáltalán nincs anagrammája az a lista legeslegalján legyen, középen szó hossz szerint csökkenő sorrend de azok amik egyenlő hosszúak csoportosítva, legfelül pedig azok szóhossz szerint csökkenő sorrendben amik anagrammák,DE csoportosítva aszerint hogy mely szónak anagrammái.
Jelenleg így néz ki:
utas
suta
botor //nincs angarammája
korok //nincs angarammája
amorf
forma
tarka //nincs angarammája
farom
elolt
letol
.
.
.
leltek //nincs angarammája
torpan //nincs angarammája
szabja
bajsza
kiadja
ajkaid
lankad
kaland
.
.
.
miniszter
miszerint
kalandtura
hajnalokat
hatoljanak
Én végeredményben azt kellene, hogy amit "//nincs angarammája"-val jelöltem az legalulra kerüljön.
Nem tudom mennyire érthető ez így, mindenesetre itt az eddigi kód:
public void rendez()
{
Szavak.Sort(delegate (string x, string y)
{
if (x.Length > y.Length) return 1;
else if (x.Length == y.Length && anagramma_e(x, y) == false) return -1;
else if (x.Length == y.Length && anagramma_e(x, y) == true) return 0;
else return -2;
});
foreach (var item in Szavak)
{
Console.WriteLine(item);
}
}
(Mivel nem sok kód nem használtam kód-megosztó oldalt)
Vagy csak én értelmezek valamit félre és úgy kell ahogy csináltam???
Igazad van, tényleg nem jó, ahogy mondtam. Nem lehet két nem anagrammára simán 1-et visszadni, mert akkor (a,b) és (b,a) összehasonlítás nem lesz konzisztens.
Helyesen így kéne megcsinálni:
Ha a két szó hossza nem egyenlő, a rövidebbet tegye előre.
Ha két hossza egyenlő:
rendezze mindkét szó betűit ABC sorrendbe.
Amelyik így képzett szó előbb jön azt tegye előbbre. Ha ugyanaz a kettő, akkor anagramma és 0-t adjon vissza.
Így ez megoldja az eredeti feladatot.
Sajnos még nem volt időm leprogramozni :)
#12 Az első válaszban te struktúrát ajánlottál. Ettől függetlenül a sorba rendezés valóban kellett (egy ilyen fgv-em egyébként alapból is volt). Egyébként az #5, #11-es válaszok alapján látszólag megoldottam és valóban működik
static int Comapare(string szo1, string szo2)
{
if (szo1.Length != szo2.Length)
{
if (szo1.Length > szo2.Length) return 1;
else return -1;
}
else
{
string egyik = rendez(szo1);
string masik = rendez(szo2);
if (egyik.CompareTo(masik) == 1) return 1;
else if (egyik.CompareTo(masik) == -1) return -1;
else return 0;
}
}
Kis apróság:
"if (szo1.Length > szo2.Length) return 1;
else return -1;"
Ehelyett elég az, hogy
return szo1.Length - szo2.Length;
"if (egyik.CompareTo(masik) == 1) return 1;
else if (egyik.CompareTo(masik) == -1) return -1;
else return 0;"
Ehelyett meg elég az, hogy
return egyik.CompareTo(masik);
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!