Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2018-03-22, 12:07
  #1
Medlem
Hej, jag har suttit i ett par dagar nu för att försöka klara detta helt på egen hand, men tiden är nu kommen att be om hjälp.

Detta är sista upgiften i en nybörjarkurs i C#
Jag har en array med upp till 24 objekt:

(string, int, string)
1. cola, 6kr, läsk
2. fanta, 6kr, läsk
3. ramlösa, 5kr, kolsyrat vatten
4. spendrups, 8kr, lättöl
5. tom rad

Jag har försökt komma på ett sätt att sortera just namnen i varje objekt, ex: cola, fanta osv i bokstavordning.
Men jag har verkligen inte kommit någon vart och undrar nu om jag skulle kunna få lite hjälp på traven?

Detta är såklart inte all kod jag skrivit, utan bara relevanta namn så att jag lättare ska kunna förstå era svar

Kod:
class Soda
    
{
        
string name;
        
int price;
        
string type;
        
        public 
string Name
        
{
            
get { return name; }
            
set name value; }
        }
        public 
int Price
        
{
            
get { return price; }
            
set price value; }
        }
        public 
string Type
        
{
            
get { return type; }
            
set type value; }
        }
        public 
Soda()
        {
            
Name "Namn";
            
Price 0;
            
Type "Kategori";
        }
        public 
override string ToString()
        {
            
string text null;
            
text += "| Namn: " Name;
            
text += " | Pris: " Price;
            
text += " | Kategori: " Type " |";
            return 
text;
        }
    }

    class 
sodacrate
    
{
           const 
int SIZE 24;
           private 
Soda[] bottles = new Soda[SIZE];
    } 
__________________
Senast redigerad av Runningsnail 2018-03-22 kl. 12:10.
Citera
2018-03-22, 14:06
  #2
Medlem
konvertera första bokstaven till byte borde ge ascii värdet och den i sin tur är redan ordnad i storleksordning. a = 97 upp till z = 122. Jämför värdena i arrayen och byt plats i en loop.
Citera
2018-03-22, 14:38
  #3
Medlem
Hur konverterar jag första bokstaven i bottles[i].Name då? Ex: Cola. Det jag tycker är svårt är att komma åt Name i objektet över huvudtaget.
Citera
2018-03-22, 15:30
  #4
Medlem
Citat:
Ursprungligen postat av Runningsnail
Hur konverterar jag första bokstaven i bottles[i].Name då? Ex: Cola. Det jag tycker är svårt är att komma åt Name i objektet över huvudtaget.
Du kan låta din Soda-klass implementera IComparable<Soda>.
I och med det måste du implementera metoden "int CompareTo(Soda other)" i din Soda-klass.

Eftersom Name är av typen string så är implementationen trivial, du kan använda dig av string-klassens CompareTo-metod. Så:
return Name.CompareTo(other.Name);

Då är allt som återstår att anropa Array.Sort(bottles) på lämplig plats.
Citera
2018-03-22, 15:49
  #5
Medlem
Citat:
Ursprungligen postat av Blippster
Du kan låta din Soda-klass implementera IComparable<Soda>.
I och med det måste du implementera metoden "int CompareTo(Soda other)" i din Soda-klass.

Eftersom Name är av typen string så är implementationen trivial, du kan använda dig av string-klassens CompareTo-metod. Så:
return Name.CompareTo(other.Name);

Då är allt som återstår att anropa Array.Sort(bottles) på lämplig plats.

Ska ta reda på vad allt detta betyder Så ska jag se om jag lyckas hehe
Citera
2018-03-22, 16:20
  #6
Medlem
Citat:
Ursprungligen postat av Runningsnail
Ska ta reda på vad allt detta betyder Så ska jag se om jag lyckas hehe
Bra inställning! Lycka till. Behöver du fråga något så är det bara att fråga. Annars kan du googla på IComparable Array.Sort så kommer du nog hitta en liknande frågeställning på SO eller liknande.
Citera
2018-03-22, 16:21
  #7
Medlem
Jag TROR jag förstår vad som händer men det kommer upp ett felmeddelande på public: Member modifier 'public' must precede the member type and name.

Kod:
public int CompareTo(Soda other)
        {
            return 
Name.CompareTo(other.Name);
        } 

Sen behöver jag bara dubbelkolla om du menade att denna "IComparable<Soda>" ska sitta som en klassvariabel typ?
Citera
2018-03-22, 16:38
  #8
Medlem
Fixade problemet nu. Men när jag provade att sortera så kraschade programmet, då det säger att other = null.
Citera
2018-03-22, 16:45
  #9
Medlem
Citat:
Ursprungligen postat av Runningsnail
Jag TROR jag förstår vad som händer men det kommer upp ett felmeddelande på public: Member modifier 'public' must precede the member type and name.

Kod:
public int CompareTo(Soda other)
        {
            return 
Name.CompareTo(other.Name);
        } 

Sen behöver jag bara dubbelkolla om du menade att denna "IComparable<Soda>" ska sitta som en klassvariabel typ?
IComparable<Soda> är ett interface. Du använder det i din deklaration av Soda-klassen:
Kod:
class Soda : IComparable<Soda> {
 [...]
 public int CompareTo(Soda other) {
   return Name.CompareTo(other.Name);
 }
}
Citera
2018-03-22, 17:13
  #10
Medlem
Citat:
Ursprungligen postat av Runningsnail
Fixade problemet nu. Men när jag provade att sortera så kraschade programmet, då det säger att other = null.
Du är snabb!

Jag missade att du hade fix längd, och tomma element, i din array.
Sort-metoden, och därmed CompareTo, kommer att köra igenom alla element i din array. Eftersom du har deklarerat en längd på 24 så kommer de flesta positionerna att vara "tomma", de kommer att ha värdet null.
other.Name är då ett anrop på ett null-objekt.

Det finns lite olika sätt att komma till rätta med det problemet. Jag antar nu att du har listan "ordnad", dvs elementen börjar på index 0 och fortsätter inkrementellt utan "glapp" med tomma platser mitt i.

I så fall finns en variant av Sort-metoden som tar (Array array, int index, int length).
array: din array du vill sortera,
index: startindex för sortering (0),
length: antal element att sortera (4 i ditt exempel).
Så: Array.Sort(bottles, 0, 4) skulle lösa det.

4 blir ju då dynamisk. Antingen så använder du en variabel för att hålla kolla på antalet element du lagt till. Om du saknar en sån variabel, eller tycker det verkar bökigt att hålla ordning på, så skulle jag rekommendera att skriva en liten extension-method som räknar null-skilda objekt i arrayen och anropa den när du ska sortera.
Citera
2018-03-22, 17:42
  #11
Medlem
Fast med den koden så specificerar man väl inte vad i arrayen som ska sorteras

Sen så får man välja på vilken plats man vill lägga flaska på. Så det blir glapp. Sorry att jag inte specificerade det..

Edit: jag har variabel som håller reda på antalet flaskor.
Citera
2018-03-22, 19:01
  #12
Medlem
Citat:
Ursprungligen postat av Runningsnail
Fast med den koden så specificerar man väl inte vad i arrayen som ska sorteras

Sen så får man välja på vilken plats man vill lägga flaska på. Så det blir glapp. Sorry att jag inte specificerade det..

Edit: jag har variabel som håller reda på antalet flaskor.
Det är din implementering av CompareTo i Soda-klassen som bestämmer vad som sorteras på.

Hade man haft fria tyglar så hade man löst det här med Linq. Men för att hålla det på någorlunda nybörjarvänlig nivå så skulle jag lösa det med Array.Sort(Array, IComparer).
Så du behåller din kod som den är, men så skapar du en implementering av IComparer. Den returnerar en int, och tar två Soda som parameterar.
Kod:
private int Comparator(Soda a, Soda b) {
  if (a== null)
    return 1;
  if(b == null)
    return -1;
  return a.CompareTo(b);
}
Anropet blir nu Array.Sort(bottles, Comparator);

Det finns mycket elegantare sätt att göra det här på, framförallt är funktionaliteten redan implementerad i List<T>-klassen. Men det där borde lösa ditt problem någorlunda vackert.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback