30/09/2018, 16:47

Cách sử dụng Sort trong ArrayList trong C#?

Em đang làm bài tập đề bài yêu cầu tạo class

  • Account: gồm ID, Tên, Họ, Lương.
  • AccountList: chứa mảng các account sử dụng ArrayList

Giờ đề bài yêu cầu em sắp xếp theo ID, Tên, Lương, Họ thì em định dụng thuộc tính ArrayList.Sort nhưng em không sort đc?

Em có xem trên mạng thì cần dùng thêm hàm IComparer. Nhưng bữa giờ em làm hoài cũng không đc.

Mọi người có ai biết hướng dẫn em làm phần này với. Em cám ơn nhiều.

Nguyễn Minh Dũng viết 18:53 ngày 30/09/2018

Em gửi thêm code em đã làm đi, sửa trên đó sẽ dễ hơn.

À, có phải bài dưới có liên quan đến topic này không?

Em cài đặt hàm so sánh như vậy: public class AccountIDComparer:IComparer<Account> { public int Compare(Account x, Account y) { return x.AccountID.CompareTo(y.AccountID); } } Và khi cài đặt trong classAccountList thì bị lỗi như vậy [image] Vậy làm sao để sử dụng được hàm IComparer? Phần này là e làm theo ví dụ trên mạng chứ cũng chưa hiểu đoạn Accounts.Sort(new AccountIDComparer()) là có ý nghĩa như thế nào nữa!!!

@dangh @tuancoi2506 có thời gian giúp được không

Phạm Hoàng Tuấn viết 18:51 ngày 30/09/2018

Của e đây, e tham khảo nhé, a mới chỉ sort theo họ và tên, e có thể tự tạo thêm các class để có thể sort theo id và lương.


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;
    
    namespace DemoArrarList
    {
        class Program
        {
            public class Account
            {
                public string sID { get; set; }
                public string sTen { get; set; }
                public string sHo { get; set; }
                public double dLuong { get; set; }
    
                public Account(string id, string ten, string ho, double luong)
                {
                    sID = id;
                    sTen = ten;
                    sHo = ho;
                    dLuong = luong;
    
                }
                public void print()
                {
                    Console.WriteLine("Id= {0},Ten={1}, Ho={2}", sID, sTen, sHo);
                }
            }
    
            public class ListAccount
            {
                public ArrayList _listAcccount = new ArrayList();
    
                public void PrintList()
                {
                    foreach (Account ac in _listAcccount)
                    {
                        ac.print();
                    }
                }
            }
    
            public class SortTheoHo : IComparer //Tao 1 class sort theo ho
            {
                int IComparer.Compare(object x, object y)
                {
                    Account _acount1 = x as Account;
                    Account _acount2 = y as Account;
                    return String.Compare(_acount1.sHo, _acount2.sHo);
                }
            }
    
            public class SortTheoTen : IComparer //Tao 1 class sort theo ten
            {
                int IComparer.Compare(object x, object y)
                {
                    Account _acount1 = x as Account;
                    Account _acount2 = y as Account;
                    return String.Compare(_acount1.sTen, _acount2.sTen);
                }
            }
            static void Main(string[] args)
            {
                Account _ac1 = new Account("001", "TenA", "Nguyen", 3000);
                Account _ac2 = new Account("002", "TenB", "Le", 3000);
    
                ListAccount listAcount = new ListAccount();
                listAcount._listAcccount.Add(_ac1);
                listAcount._listAcccount.Add(_ac2);
    
                Console.WriteLine("Before sort....");
                listAcount.PrintList();
    
                listAcount._listAcccount.Sort(new SortTheoHo()); //Sort theo ho
                Console.WriteLine("After sort theo ho....");
                listAcount.PrintList();
    
                listAcount._listAcccount.Sort(new SortTheoTen()); //Sort theo ten
                Console.WriteLine("After sort theo ten....");
                listAcount.PrintList();
    
                Console.ReadLine();
    
            }
        }
    }

Đỗ Mạnh Hà viết 19:01 ngày 30/09/2018

Theo như mình thấy thì là do ArrayList của bạn lưu 1 dãy các đối tượng mà bạn chưa Override lại phương thức Sort của nó nên nó không biết cách sort như thế nào, mặc định nó sort các giá trị như String, Int32, Int64, … chứ nếu muốn sort Object thì bạn phải định nghĩa lại phương thức của nó.

AnNdth viết 18:50 ngày 30/09/2018

tAcount.PrintList()

Em cám ơn a nhiều. V khi em sort theo ID thì e phải thay String bằng gì ạ, e mới học c# nên còn lúng túng phần này quá…

Phạm Hoàng Tuấn viết 18:53 ngày 30/09/2018

ID của e kiểu dữ liệu là gì ??? String.Compare là phương thức dùng để so sánh 2 chuỗi thôi mà.

AnNdth viết 18:49 ngày 30/09/2018

Dạ e để ID là int và Balance e để là float. A cho e hỏi nếu để 2 kiểu đó thì mình phải thay String thành kiểu nào cho phù hợp ạ?

Phạm Hoàng Tuấn viết 19:03 ngày 30/09/2018

Với kiểu dữ liệu như vậy, thì e so sánh bình thường là được rồi mà.
Ví dụ :


int IComparer.Compare(object x, object y)
{
        Account _acount1 = x as Account;
        Account _acount2 = y as Account;
         if(_acount1.ID>_acount2.ID)
                return 1; //Lớn hơn
         if(_acount1.ID>_acount2.ID)
               return -1;//Nhở hơn
         return 0;//Bằng nhau
}

AnNdth viết 18:59 ngày 30/09/2018

Dạ, Tại e tưởng là mình dùng theo kiểu return String.Compare() giống trên luôn chứ k cầnn phải viết tường minh ra. Mà mình cho nó tự hiểu như String đc k a?

Phạm Hoàng Tuấn viết 18:48 ngày 30/09/2018

Mỗi kiểu dữ liệu có 1 cách so sánh riêng mà e.
Hoặc e có thể sử dụng với kiểu Interger như sau, còn kiểu float thì hình như k có

int IComparer.Compare(object x, object y)
{
        Account _acount1 = x as Account;
        Account _acount2 = y as Account;
        return _acount1.ID.CompareTo(_acount2.ID);
}
AnNdth viết 19:00 ngày 30/09/2018

Dạ. Em cám ơn anh nhiều

AnNdth viết 18:52 ngày 30/09/2018

Anh ơi cho em hỏi trong một ArrayList em muốn gọi đến một chỉ số của ArrayList thì em phải làm sao a? Ví dụ em tìm người có mức lương cao nhất: Em gọi hàm sắp xếp từ tăng đến giảm. Sau đó, em chỉ in ra người đầu tiên trong danh sách v có được không anh?

Phạm Hoàng Tuấn viết 18:52 ngày 30/09/2018

E dùng List[0] để lấy phần tử đầu tiên. Các phần tử trong Arraylist đánh số từ 0->n-1, với n là tổng số phần tử.

AnNdth viết 19:01 ngày 30/09/2018
    //Hàm để xuất Account
         public void Report()
            {
                int i = 0;
                foreach (Account acc in Accounts)
                {
                    Console.WriteLine("STT: {0}", ++i);
                    acc.Query();
                }
            }
    
    
    //Hàm xuất ArrayList
     public void Report()
                {
                    int i = 0;
                    foreach (Account acc in Accounts)
                    {
                        Console.WriteLine("STT: {0}", ++i);
                        acc.Query();
                    }
                }      

//Hàm tìm mức lương        
         public void TimMucLuongMax()
                {
                    Accounts.Sort(new AccountBalanceComparer());
                    //Xuất ra phần tử đầu tiên tức mức lương lớn nhất
                }

Nếu sử dụng List[0] e phải gọi như thế nào mới xuất ra được a???

Phạm Hoàng Tuấn viết 18:56 ngày 30/09/2018

Accounts

E thử gọi : Accounts[0].Report() xem đúng k

AnNdth viết 19:03 ngày 30/09/2018

Dạ. Không đc a. Khi e thực hiện Accounts[0].(Equals, GetHashCode, GetType, ToString thôi a).
Hay tại em gọi nó ở trong class AccountList chứa Report() nên không thể thực hiện lệnh đc???

Phạm Hoàng Tuấn viết 18:59 ngày 30/09/2018

Ủa, e fai gọi nó ở hàm Main chứ nhỉ ???Sort cũng ở ngoài hàm Main chứ

AnNdth viết 18:54 ngày 30/09/2018

Dạ k ý em là cài đặt hàm trong một class AccountList rồi sau đó em mới gọi trong hàm main đó a…

AnNdth viết 18:55 ngày 30/09/2018

acc.TimMucLuongMax();
acc[0].Report();

Nếu e gọi như v trong hàm Main nó vẫn báo lỗi chỗ acc[0] a ơi…

Phạm Hoàng Tuấn viết 18:48 ngày 30/09/2018

E thử copy toàn bộ code của e lên đây đi e

AnNdth viết 18:52 ngày 30/09/2018
public class Account
{
    private int accountID;
    private string firstName;
    private string lastName;
    private decimal balance;

    //Implement IComparable interface
    public int CompareTo(object obj)
    {
        if(obj is Account)
        {
            return this.accountID.CompareTo((obj as Account).accountID);
        }

        throw new ArgumentException("Object is not a User");
    }

    public void FillInfo()
    {
        Console.WriteLine("----------------------------------------------------------------------------");
        Console.Write("Account ID: ");
        accountID = int.Parse(Console.ReadLine());
        Console.Write("First Name: ");
        firstName = Console.ReadLine();
        Console.Write("Last Name: ");
        lastName = Console.ReadLine();
        Console.Write("Balance: ");
        balance = int.Parse(Console.ReadLine());
        Console.WriteLine("----------------------------------------------------------------------------");
    }

    public void Query()
    {
        Console.WriteLine("----------------------------------------------------------------------------");
        Console.WriteLine("Account ID: {0}", this.accountID);
        Console.WriteLine("First Name: {0}", this.firstName);
        Console.WriteLine("Last Name: {0}", this.lastName);
        Console.WriteLine("Balance: {0}", this.balance);
        Console.WriteLine("----------------------------------------------------------------------------");
    }

}


//------------------------------------------------- CLASS ACCOUNT LIST --------------------------------------------------------


public class AccountList
{
    private ArrayList Accounts = new ArrayList();

    public ArrayList ACCOUNTS
    {
        get { return Accounts; }
        set { Accounts = value; }
    }


    //-------------------------------------1.Add -------------------------------------
    public void NewAccount()
    {

        Account acc = new Account();
        Console.WriteLine("NHAP THONG TIN NGUOI DUNG");
        acc.FillInfo();
        Accounts.Add(acc);
    }


    //-------------------------------------2. Xuất  -------------------------------------
    public void Report()
    {
        int i = 0;
        foreach (Account acc in Accounts)
        {
            Console.WriteLine("STT: {0}", ++i);
            acc.Query();
        }
    }

    //------------------------------------------8.Sắp xếp theo thứ tự tăng dần của Balance----------------------
    public void SapXepTangLuong()
    {
        Console.WriteLine("\nSap xep tang theo Luong");
        Accounts.Sort(new AccountBalanceComparer());
        Report();
    }

    //------------------------------------------9. Tìm người có mức lương cao nhất----------------------
    public void TimMucLuongMax()
    {
        Accounts.Sort(new AccountBalanceComparer());
    }

    //So sánh theo lương giảm dần
    public class BanlanceComparer:IComparer
    {
        int IComparer.Compare(object x, object y)
        {
            Account acc1 = x as Account;
            Account acc2 = y as Account;
            if (acc1.Balance > acc2.Balance)
                return -1;
            if (acc1.Balance < acc2.Balance)
                return 1;
            return 0;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            AccountList acc = new AccountList();

            int c;
            do
            {
                Console.WriteLine("\t1. Add");
                Console.WriteLine("\t2. Save");
                Console.WriteLine("\t3. Load");
                Console.WriteLine("\t4. Report");
                Console.WriteLine("\t5. Remove");
                Console.WriteLine("\t6. Sap xep tang dan theo ID");
                Console.WriteLine("\t7. Sap xep tang dan theo ten");
                Console.WriteLine("\t8. Sap xep tang theo luong");
                Console.WriteLine("\t9. Tim nguoi co muc luong cao nhat");
                Console.WriteLine("\t0. Exit");

                Console.Write("\n\nNhap vao lua chon: ");
                c = int.Parse(Console.ReadLine());
                switch (c)
                {
                    case 9:
                        {
                            acc.TimMucLuongMax();

                            break;
                        }
                    case 0:
                        {
                            break;
                        }
                }
            } while (c != 0);
        }
    }
}

Code của e đó a.

Bài liên quan
0