30/09/2018, 16:02

Tìm kiếm tên trong danh sách

Em có 1 mảng string gồm danh sách các họ và tên, chẳng hạn như

string list[]={'Nguyen van A', 'Nguyen van B', 'Le Van A', 'Dao van A'}

Gợi ý giúp em ý tưởng để khi tìm kiếm tên A, thì nó in ra 3 cái tên Nguyen Van A, Le Van A, Dao Van A.
Em cảm ơn ạ

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

Em muốn dùng ngôn ngữ gì?

Phát Nguyễn viết 18:10 ngày 30/09/2018

Em dùng C++ ạ.

//Chỗ này là em viết cho đủ 20 ký tự để đc reply bài
Nguyễn Minh Dũng viết 18:03 ngày 30/09/2018

Trong C++, std::string có hỗ trợ phương thức find. Khi tìm kiếm, nếu tìm thấy thì phương thức string::find sẽ trả về vị trí đầu tiên tìm thấy chuỗi. Nếu không tìm thấy thì string::find sẽ trả về std::string::npos tương đương với -1.

Em xem ví dụ dưới đây.

#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen van A", "Nguyen van B", "Le Van A", "Dao van A"};
    for(int i = 0; i < 4; ++i)
        if (list[i].find("A") != std::string::npos)
            std::cout << list[i] << std::endl;
    return 0;
}
Đỗ Trung Quân viết 18:19 ngày 30/09/2018

Có 1 trường hợp có thể xảy ra.
Ví dụ lúc gặp 1 thằng tên Nguyễn A B. Nhưng mình tìm những thằng tên A thì sao?. Nó vẫn in ra thằng nguyễn A B này?
Vậy phải làm sao kiểm tra A có ở cuối String đó hay không.

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

Khi đó mình sử dụng std::string::find_last_of để tìm vị trí xuất hiện cuối cùng của A. Xem nó có phải ở cuối chuỗi không. Trường hợp này phức tạp hơn, nên phải nghiên cứu sao cho phù hợp với bài toán của mình.

Đỗ Trung Quân viết 18:05 ngày 30/09/2018

Cái này khó thật. Em có ý tưởng tách từng string trong list ra rồi kiểm tra từng string 1 mà còn khó hơn nữa :))).

Đỗ Trung Quân viết 18:09 ngày 30/09/2018

Khi đó mình sử dụng std::string::find_last_of để tìm vị trí xuất hiện cuối cùng của A. Xem nó có phải ở cuối chuỗi không. Trường hợp này phức tạp hơn, nên phải nghiên cứu sao cho phù hợp với bài toán của mình.

Hehe,Em tìm ra cách rồi anh, tách ra từng string có chứa A rồi kiểm tra xem nó có ở cuối k?. Ở đây em lấy độ dài -1 vì là A. Em thay = Quan rồi trừ 4 vẫn đúng ^^

#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen van A", "Nguyen A B", "Le Van A", "Dao van A"};
    std::string str2 = "Quan"; // 4
    for(int i = 0; i < 4; ++i){
    	if (list[i].find("A") != std::string::npos){
    		// kiem tra A co o cuoi list[i] hay khong
    			if(list[i][list[i].length() -1 ] =='A'){
    				//in ra
    				std::cout<<list[i]<<std::endl;
    			}
    		//	
    		
    		//in ra list[i]
    	//	std::cout<<list[i].length()<<std::endl;
    	}
    }
        
    return 0;
}

@ltd

Đỗ Trung Quân viết 18:16 ngày 30/09/2018

Nhưng mà khổ cái phải kiểm tra từng ký tự nếu là Quân. -1 -2 -3 -4 lần lượt = n a u Q. haha.
làm sao kiểm tra

  list[i] = str2; // "Quan"
Nguyễn Minh Dũng viết 18:18 ngày 30/09/2018
#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen van A Van", "Nguyen van A B", "Le Van A", "Dao van A"};
    std::string firstName = "Van";
    for(int i = 0; i < 4; ++i) {
        std::string fullName = list[i];
        int nFirstName = fullName.find_last_of(firstName);
        if (fullName.length() - 1 == nFirstName)
            std::cout << list[i] << std::endl;
    }
            
    return 0;
}

Thử với cái này được không @Is2IT

Đỗ Trung Quân viết 18:07 ngày 30/09/2018

Đúng rồi anh ^^. Done! clos topic =)))

Đỗ Trung Quân viết 18:12 ngày 30/09/2018

Thử với cái này được không @Is2IT

Xem lại vẫn không đủ anh ạ. Chắc vẫn phải kiểm tra hết đủ các chữ luôn.
Nếu list string là cái này.

  std::string list[]={"Nguyen van A van", "Nguyen van A Ban", "Le Van An", "Dao van On"};

Nó sẽ in ra hết các thằng có tận cùng là chữ “n”.

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

Ừm, a hiểu sai lệnh find_last_of lệnh này so sánh ký tự, không phải chuỗi.

Vậy giờ em dùng strtok để tách chuỗi ra thành nhiều chuỗi nhỏ, rồi dùng strcmp để so sánh chuỗi cuối cùng(tức tên).

Đỗ Trung Quân viết 18:17 ngày 30/09/2018

Tách ra có vẻ nhanh hơn. Em làm cách khác, kiểm tra xem firstName ở vị trí nào.

firstName.pos() + với độ dài firstName.length() = fullName.length(); //đúng
Đỗ Trung Quân viết 18:03 ngày 30/09/2018

Lúc trưa đi ngủ quên chưa up code. Anh @ltd xem đúng không.

#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen Van Ngoc", "Nguyen Ngoc Ban", "Ngoc Van An", "Dao Nhan"};
    std::string firstName = "Ngoc";
    
    for(int i = 0; i < 4; ++i) {
    	if (list[i].find(firstName) != std::string::npos){
    		std::string fullName = list[i];
                // tìm vị trí "Ngọc" xuất hiện cuối cùng trong fullName	
    		int d = fullName.rfind(firstName);
                // Nếu "Ngọc" là firstName thì + Ngọc.length() = size(fullName)
    		if(d+firstName.length() == fullName.length()) 
    			std::cout<<fullName;
   		}
    }      
    return 0;
}
Đỗ Trung Quân viết 18:07 ngày 30/09/2018

Ẹc, quên chưa sửa chỗ find(“Van”) của anh Đạt =)). Done!

Bài liên quan
0