Sortowanie w kolekcjy Stack i Queue

0

Mam problem i proszę o pomoc. mam obiekty klasy skok; każdy obiekt ma nazwę string i metry int;
i te obiekty umieszczałem w kolekcji Stack i chcę ich posortować według metry.
czyli tak

 class skok
    {
        string nazwisko;
        int metry;
        public skok(string naz)
        {
            this.nazwisko = naz;
            Random mt = new Random();
            this.metry = mt.Next(300);
        }

        public void pokaz()
        {
Console.WriteLine("\nZawodnik\n{0},skoczyl  : {1} - metry",this.nazwisko,this.metry);
        }

  }




    class Program
    {
        static void Main(string[] args)
        {
           
            Console.WriteLine(" ilu zawodnikow ma skoczyc ? : ");
            int zawodnikow = int.Parse(Console.ReadLine());

           List<skok>konter = new List<skok>();

            for (int i = 0; i < zawodnikow; i++)
            {
                Console.WriteLine(" \nPodaj nazwisko {0}-ego zawodnika ", i + 1);
                string nazw = Console.ReadLine();

                //tworzymi obiekt klasy skok
                skok zawod= new skok(nazw);

               konter.Add(zawod);
            }

            foreach (skok s in konter)
            {
                s.pokaz();
            }             
                 

I jakoś nie mogę załapać czy to jest możliwe by ich posortować w tych kolekcjach, czy muszę przenieść do tablicy i potem posortować ? jeśli można bez tablicy to jak to ma być?
Dzięki z góry
P.S. trochę poobcinałem kod, zostawiłem najważniejsze części.

0

Jak dla mnie to nie jest problem jako taki bo stos jest kolekcją której się nie sortuje. W stosie ważna jest kolejność dodawania i sposób wyciągania z niego danych.

0

A gdybym to miał w List-e.to jak?
Pozmieniam u góry żeby tu nie bałaganić.

0

Ja to wszystko przeszukałem Johny_Bravo, tam NIE MA tego. jest List<string>
a ja potrzebuję List<skok>(klasa tworzona przeze mnie) żeby sortowało według pola jemu podanej.
A jak to podać nie wiem.

0

Aha , problem był w tym , znowu napisze wszystko żeby wyjaśnić

namespace kolekcje
{
    class skok : IComparable
    {
        string nazwisko;
        int metry;
        public skok(string naz)
        {
            this.nazwisko = naz;
            Random mt = new Random();
            this.metry = mt.Next(300);
        }

        public void pokaz()
        {
            Console.WriteLine("\nZawodnik\n{0},skoczyl  : {1} - metry", this.nazwisko, this.metry);
        }
        int IComparable.CompareTo(Object obj)
        {
            if (obj is skok)
            {
                skok rownaj = (skok)obj;
                if (this.metry > rownaj.metry)
                    return 1;
                if (this.metry < rownaj.metry)
                    return -1;
                else return 0;
            }
            throw new ArgumentException(" niema takiego obiektu ");
        }


    }

    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine(" ilu zawodnikow ma skoczyc ? : ");
            int zawodnikow = int.Parse(Console.ReadLine());

            List<skok> konter = new List<skok>();

            for (int i = 0; i < zawodnikow; i++)
            {
                Console.WriteLine(" \nPodaj nazwisko {0}-ego zawodnika ", i + 1);
                string nazw = Console.ReadLine();

                 skok zawod = new skok(nazw);

                 konter.Add(zawod);
            }

            foreach (skok s in konter)
            {
                s.pokaz();
            }             
            
            Console.Read();  /* UWAGA TUTAJ   */

            konter.Sort();

            foreach (skok n in konter)
            {

                n.pokaz();
            }

            Console.ReadLine();
        }
    }
}

u góry co zaznaczyłem, w tym miejscu właśnie mi przerwało program, a bez tego Console.Read
działa jak trzeba.( to tak dodałem żeby po kliknięciu klawiszy dopiero sortował). a dla czego przerwało? [???]

0

A jak przerwalo to byl jakis komunikat? Typu 'byl wyjatek'?

0

Nie , tak jakby już doszło do końca i zniknął ekran konsoli.przecież i na samym końcu też
nastawiłem Console.Readline() żeby się zatrzymał , i to nie pomogło więc myśliałem
że problem w Sort().

0

Najwyrazniej z poprzedniego czytania klawiatury zostal jakis znak (koncowka entera, czy cus) i ReadLine zczytal z bufora, bo bylo, wiec nie czekal na wcisniecie.

0

no ja też tak myślę, tylko dla czego ostatni ReadLine tego nie zatrzymał. ale to nic.
A jest jakiś cin.ignore()-opodobny coś w C#?
Dzięki za odpowiedzi. ;-)

0

Sprobuj to A jak nie to wez z consoli czysty obiekt bufora i sam go wyczysc.

Sfinks napisał(a)

no ja też tak myślę, tylko dla czego ostatni ReadLine tego nie zatrzymał. ale to nic.

Moze 2x razy wcisnales enter, czy cus.

0
Sfinks napisał(a)

A jest jakiś cin.ignore()-opodobny coś w C#?

johny_bravo napisał(a)

Sprobuj to A jak nie to wez z consoli czysty obiekt bufora i sam go wyczysc.

czyli jak ? mógłbyś podać przykład?

0

Jednak sie nie da. Strumien z konsoli zaklada, ze nie ma konca, wiec nie da sie go wyczyscic, bo automatycznie oczekuje na kolejne znaki.

0

A mogło by w tym moim przykładzie być coś takiego ? np:
gdy skończyło swoje działanie kolekcja(tzn wyświetliło obiekty) to ono z kliknięciem klawiszy zwolniło
wszystkie obiekty z pamięci. może w C# 3.0 takie coś dodali, automatycznie zwalnianie pamięci albo coś w tym stylu.

0

Ktore obiekty? Oczywiscie moglo zwolnic tymczasowe, przeciez w .net jest garbage collector. A czy akurat zadzialal w tym miejscu, to trudno stwierdzic, jest niezalezny od wykonania programu.

0
  1. Stworzyć nowy projekt konsolowy.

  2. Wkleić do niego ten program.

  3. Na początku dodać.

using System;
using System.Collections.Generic;

  1. Po ostatnim Console.ReadLine(); dodać drugi.

I chodzi tak jak ma chodzić. Czyli po enterze sortuje skoki według ich długości.
I dzięki wszystkim za pomoc ;-P

0

Zamiast Console.Read jak dajesz ReadLine(nie na końcu ,a tam co zaznaczyłem)
też chodzi tak jak mnie było trzeba, Pytanie-> a skąd był ten 1 bajt w buforze ? ,i
jak można wypłukać bufor kiedy będzie trzeba ?.np dajesz warunek w while że ma
być wprowadzone 1 znak, a ktoś dla próby kliknie 10, to jak można zabezpieczyć
żeby kompilator przyjął 1 znak pierwszy a resztę wywalił z bufora . w C++ robi się
to tak cin.ignore(INT_MAX,'\n').
Więc Twój odpowiedź ma się nie jak do tego problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1