[C#] Домашно Multidimensional Arrays - 5 задача


8
Здравейте! Потърсих тема за тази 5 задача и тъй като не открих реших аз да я започна.
Ето условието:
"Даден ви е масив от тип string. Да се напише метод, който да сортира елементите на масива според дължината им (броят на символите, съдържащи се в съответния string)."
Ето моето решение:
http://pastebin.com/WjwqF7NZ
Това което съм направил е да използвам статичния метод Array.Sort с конкретния overload, който ми позволява като първа променлива да използвам масива, а като втора да дам критерии за сравнение (например клас имплементиращ интерфейса IComperer).
Съответно съм си дефинирал клас StringComparer, който наследява IComperer, което се записва class StringComparer : IComperer.
За да имплементирам IComperer моят клас трябва да съдържа метод Compare(object a, object b), който да ми задава точния критерии по който ще се сравняват двата обекта a и b. В моя случай Compare метода прави следното - ако са различни дължините на двата стринга, той връща стойност от сравнението на двете целочислени дължини. Ако са равни дължините, той връща стойност от лексикографското сравнение на двата стринга.
И така. В началото въвеждам броя на елементите в масива. След това въвеждам самите елементи. След това ги сортирам, изполвайки гореописания метод. И накрая отпечатвам вече сортирания масив.
Надявам се да съм бил полезен с обяснението. Ако все пак е останало нещо неясно ще се радвам да отговарям на въпроси! :)
Поздрави!
Деян



Отговори



7

Понеже днес говорихме за ламбда изрази, ето едно решени с помощта на тях - ЦЪК  :)


от Teodor92 (13062 точки)


0
Каквото и да си говорим, решенията с ламбда изрази и linq заявки винаги изглеждат няколко пъти по-елегантни от решенията без тези средства. :)

от d_p_y (712 точки)

0
Между другото - това е второто ми решение. В първото ми решение бях се втурнал да правя го решавам с едни речници и глупости ( 50+ реда код ) и после когато го реших с ламбда на има-няма 4 реда имах чувството, че съм открил топлата вода :D

от Teodor92 (13062 точки)



0

И аз го направих с LINQ израз, но малко по различен. Първо ги подрежда и след това ги селектира.

var sortedArray = from item in input

          orderby item.Length

          select item;

foreach (string item in sortedArray)

{

    Console.WriteLine(item);

}


от nikola76 (1250 точки)


0
Може да се бъркам, но това не е ли Linq заявка, а не lambda израз или те двете са едно и също ?

от Teodor92 (13062 точки)

0
Да точно така в Linq могат да се използват lambda изрази.

от nikola76 (1250 точки)



7
Едно решение и от мен:http://ideone.com/PFBFD2
Какво прави моят метод:
1. Подавам му референция към масива със стрингове.
2. Вземам дължината на всеки от стринговете в масива.
3. Сортирам масива от стрингове със Array.Sort (масива от дължини, масива от стрингове). Така масива от стрингове се сортира, чрез дължината на всеки от елементите си.

от petromaxa (577 точки)


0
До почти същото решение и аз съм стигнал, което си е цяло съвпадение като гледам какво творчество има в тази задача от 2 реда до 40-50... Затова го слагам като коментар на твоето. http://pastebin.com/7xdD7fdY

от shristoff (747 точки)

0
Array.Sort(lengthArray,stringArray); Още не съм сигурен, че съм разбрал правилно, но така зададено, се сортира първият масив, а вторият се нарежда със същата последователност на елементите. Дано съм го разбрал правилно и ако е така, се възхищавам на познанията Ви. Аз, като начинаещ, никога нямаше да се досетя или, да попадна на това записване. Благодаря, че споделихте!



0

https://github.com/hristo11111/SortStringArrayByLength/blob/master/.gitignore

1. Създавам масив от стрингове.
2. Използвам ламбда израз по подобие на показания в лекцията и сортирам масива директно по дължината на отделните стрингове.
3. Отпечатвам сортирания масив.

Сложил съм доста празни редове за по прегледно :)




1
Моето решение е като взех метода от Quick sort домашното от масиви и го модифицирах така че да създаде втори масив вътре в метода със стойности дължината на стринговете на елементите на стринг масива - след което модифицирах метода така че при подреждането на масива с дължините (точно при операцийте по местенето на елементите) да подрежда със същите индекси и стринг масива. Общо взето това ми е алгоритъма, има си и име - QuickStringSort.

от stoyanov (2483 точки)


1
В dotnetpearls попаднах на интересно решение.Ето имплементацията:
http://pastebin.com/Jd4x5YKt

от iwitass (3695 точки)


1
И аз го направих сравнително простичко, само с функцията на Array.Sort:
http://pastebin.com/0p9Z5JAc

от stann1 (1378 точки)


0

Споделям и аз моите решения- с ламбда и линкю.

SortStringArray


от zhelyazkovn (2949 точки)


0

Решението: https://github.com/martinivanovit/SimpleProjects/blob/master/SortByLength

Едит: Долното обяснение е за старото ми решение, новото е двойно по-кратко и вместо вложени цикли ползва метода Sort.Array(Array keys, Array values)
Повече информация за метода: http://www.dotnetperls.com/array-sort

Решението ми ползва няколко масива. Два стринг масива за низовете, един инт за дължините им, и един булев.

В първият for цикъл въвеждаме стойностите в първият масив и веднага след това им взимаме дължините, и ги слагаме в числовият масив.

Следва сортиране на колекцията с дължините, с Array.Sort() (метода сортира едномерни масиви)

По-нататък имаме вложен цикъл, в който проверяваме дали първата(и т.н.) дължина в сортираният вече числов масив е равна на дължината на някой от въведените низове.. и дали вече не сме проверили низа. Ако е така visited = true, което ще рече, че вече сме били там и повече няма да проверяваме същият низ. На първа позиция в другия стринг масив слагаме намерената стойност и след това излизаме от вложения цикъл и продължаваме да правим същото със следващите елементи от lengths(дължините)


 


от Mahata231 (1351 точки)


4

Ето едно кратко решение от мен : http://pastebin.com/mYTeSchh

Сравнявам елементите на масива чрез .Length.


от son4etyyy (416 точки)


0
Гледам горе някакви lambda функции, LINQ и викам какво стана тук да не съм объркал условието на задачата. Видях, че съм я решил като теб и си отдъхнах. Може да спестиш една итерация ако дадеш на j= i +1; защото (j =i ) и сравняваш myArray[i]==myArray[j] ненужна проверка :)

от Georgi Georgiev 1 (0 точки)

0
Нали, аз обикновено гледам да решавам задачите без допълнителни усложнения. Прав си за i и j, но просто съм свикнала да пиша по два цикъла и в случая не съм се замислила, че единия не е нужен : )

от son4etyyy (416 точки)