Copy Map cũ sang Map mới

Tôi muốn copy một object có value trùng với value tìm kiếm

public void findStaffByName(Scanner scanner) {
        System.out.println("Nhap ten can tim:");
        String nameFound = scanner.nextLine();
        Map<Integer,Object> staffListFound = new HashMap<Integer, Object>();
        for(Integer key : staffList.keySet()) {
            if(key.toString().equals(nameFound)){
                staffListFound.put(key, staffList.entrySet());
            }
        }
        staffListFound.forEach((key, value) -> System.out.println(value.toString()));

nhưng mình gặp vấn đề là nó lưu toàn bộ map cũ nên có cách nào giải quyết không?

Cậu tạo object staffListFound, và lưu dữ liệu vào staffFound, xong sau đó in ra nội dung của staffListFound, và nói rằng:

mình gặp vấn đề là nó lưu toàn bộ map cũ nên có cách nào giải quyết không?

Map cũ là map nào thế cậu? Và cậu kỳ vọng có gì trong staffListFound?

3 Likes

Tôi muốn in các staff giống tên tôi tìm chứ không phải in lại toàn bộ staff có trong map

map nào cậu? Cậu có thể nói rõ ra tên map được không? Cậu có 3 cái map lận, và tớ không biết toàn bộ code của cậu để đoán được.
Tớ cũng không rõ map của cậu đang lưu cái gì, key chứa giá trị gì, value chứa giá trị gì nữa.

Ngoài ra:

  • Tên của cậu là số nguyên phải không? Bởi vì cậu đang so sánh key (số nguyên) để tìm tên đấy.
    Tớ đoán mò cậu muốn tìm trên value, nhưng tìm sai.
  • Tại sao map của cậu lại có kiểu Value là Object? Nó nên là 1 kiểu rõ ràng hơn.
  • Trước khi cậu sửa code, Code của cậu không in ra được gì, vì như tớ đã giải thích ở trên, không có gì trong staffListFound. Sau khi sửa khả năng cao cũng sẽ như vậy.
    Ngoài ra, nếu edit code, cậu nên báo cho tớ chứ?
2 Likes
  1. Mình có 2 cái map là StaffList dùng để lưu thông tin nhân viên, StaffListFound dùng để lưu thông tin nhân viên có tên giống với tên tìm kiếm.
if(key.toString().equals(nameFound)){
        staffListFound.put(key, staffList.entrySet());
}

Nó là đoạn mình tìm được trên mạng vì mình muốn tìm nhân viên có tên giống với tên tìm kiếm và lưu nó vào trong staffListFound

  1. Mình muốn lưu toàn bộ thông tin nhân viên mà mình nhâp vào nếu có thể rõ ràng hơn thì bạn chỉ mình với vì mới tìm hiểu về map

  2. Còn về edit có vì mình muốn đặt tên rõ ràng hơn.
    Về việc edit thì mình xin lỗi quên up thông báo

1 Like

Bạn làm cái gì thế này?

Bạn cho cả danh sách các giá trị có trong staffList vào staffListFound luôn!?
Đáng lẽ ra khi tìm được 1 khóa (key) đúng thì bạn chỉ thêm giá trị tương ứng với khóa thôi chứ!

4 Likes

Tớ hiểu rồi :sweat_smile:

Như @SITUVN.gcd đã đề cập ở trên, cậu cần add value tương ứng với key cậu tìm được.

Thử code này xem cậu:

staffListFound.put(key, staffList.get(key));

Cho tớ biết nếu cậu muốn hiểu thêm nhé! Vì toàn bộ code trên của cậu có thể được viết gọn lại, nếu như cậu hiểu rõ về Map.

3 Likes

staffListFound.put(key, staffList.get(key)); nó không chạy được

Hm.
Cậu có thể trả lời cho tớ lần lượt những câu hỏi dưới đây không?

  1. Cậu có thể post đoạn code mới nhất sau khi cậu đã sửa không?
  2. Cậu có thể nói cho tớ staffListFound có gì trong đó không?
    Tớ kỳ vọng cậu trả lời nó như thế này: staffListFound có chứa các bộ <key, value> là {(1, “Staff1”), (2, “Staff2”),…}. Nhớ liệt kê tất cả những gì cậu có trong biến đó nhé!
  3. Cậu có thể nói cho tớ biết cậu nhập gì vào nameFound được không?
    Tớ kỳ vọng cậu nói rõ: mình nhập giá trị “1” vào nameFound.
  4. Làm sao cậu biết “không chạy được”? Có lỗi syntax, hay vấn đề gì khác vậy?

Trước mắt là mấy câu hỏi đơn giản đó. Cậu phải hiểu là với thông tin rất giới hạn từ cậu, không ai có thể giúp cậu, vậy nên cho tớ câu trả lời nhé! :smile:

3 Likes
  1. Đoạn code mới nhất :
System.out.println("Nhap ten can tim:");
String nameFound = scanner.nextLine();
Map<Integer,Object> staffListFound = new HashMap<Integer, Object>();
for(Integer key : staffList.keySet()) {
    if(key.toString().equals(nameFound)){
        staffListFound.put(key, staffList.get(key));
    }
}
Iterator <Map.Entry<Integer, Object>> entries = staffListFound.entrySet().iterator();
while(entries.hasNext()){
    System.out.println(entries.next().toString());
}
if(staffListFound.isEmpty()){
    System.out.println("Khong co nhan vien nao cung ten");
}
  1. staffListFound có chứa các bộ <key, value> trong đó key là index của staff nếu dk đúng, value là các staff có name equals nameFound và trong staff có các atttribute như id(tự tăng khi thêm 1 staff), name, rank, salary
  2. Mình nhập giá trị “1” vào nameFound
  3. Mình có thêm if nếu map rỗng sẽ xuất ra Không có nhân viên nào cùng tên nếu nó xuất hiện vậy là staffListFound không nhận bất kỳ value nào dù đã đúng condition.
    Khi mình dùng đoạn code này staffListFound.put(key, staffList.entrySet()); thì nó sẽ nhận toàn bộ staff có trong map đều đó cho thấy dòng if chạy thành công nên đoạn code đó mới chạy được

Tớ có thử chạy code dưới đây:

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        Map<Integer, Object> staffList = new HashMap<>();
        staffList.put(1, "Alice");
        staffList.put(2, "Bob");
        
        //========= Original code
        System.out.println("Nhap ten can tim:");
        String nameFound = scanner.nextLine();
        Map<Integer,Object> staffListFound = new HashMap<Integer, Object>();
        for(Integer key : staffList.keySet()) {
            if(key.toString().equals(nameFound)){
                staffListFound.put(key, staffList.get(key));
            }
        }
        Iterator <Map.Entry<Integer, Object>> entries = staffListFound.entrySet().iterator();
        while(entries.hasNext()){
            System.out.println(entries.next().toString());
        }
        if(staffListFound.isEmpty()){
            System.out.println("Khong co nhan vien nao cung ten");
        }
    }
}

Đầu vào từ stdin là 1, và nhận được kết quả như kỳ vọng.

Code trên không phải vấn đề đâu cậu. Cậu kiểm tra xem map staffList có chứa index phần tử mà cậu muốn tìm không nhé!

2 Likes

Đây là toàn bộ code controller của mình

public class MainController {
    Map<Integer, Object> staffList = new HashMap<Integer, Object>();
    Set<Integer> keySet = staffList.keySet();

    public void input(Scanner scanner) {
        while (true) {
            try {
                int choose = InputVaildation.integerInput("Vui long chon 1 nhan vien can nhap:\n"
                        + "1.Nhan vien quan ly\n"
                        + "2.Nhan vien ban hang\n"
                        + "3.Nhan vien van phong", scanner);

                if (choose == 0) {
                    break;
                }
                switch (choose) {
                    case 1:
                        Manager manager = new Manager();
                        manager.inputManger(scanner);
                        staffList.put(manager.getId(), manager);
                        break;
                    case 2:
                        Sales sales = new Sales();
                        sales.inputSales(scanner);
                        staffList.put(sales.getId(), sales);
                        break;
                    case 3:
                        Officer officer = new Officer();
                        officer.inputOfficer(scanner);
                        staffList.put(officer.getId(), officer);
                        break;
                    default:
                        System.out.println("Chon nhan vien can nhap");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void output() {
        staffList.forEach((key, value) -> System.out.println(value.toString()));
    }

    public void findStaffByName(Scanner scanner) {
        System.out.println("Nhap ten can tim:");
        String nameFound = scanner.nextLine();
        Map<Integer,Object> staffListFound = new HashMap<Integer, Object>();
        for(Integer key : staffList.keySet()) {
            if(key.toString().equals(nameFound)){
                staffListFound.put(key, staffList.get(key));
            }
        }
        Iterator <Map.Entry<Integer, Object>> entries = staffListFound.entrySet().iterator();
        while(entries.hasNext()){
            System.out.println(entries.next().toString());
        }
        if(staffListFound.isEmpty()){
            System.out.println("Khong co nhan vien nao cung ten");
        }
}

Và đây là chạy demo của mình

Cậu gói cả project, push lên github, rồi đưa link github đi cậu.
Cậu gửi 1 cái class mà không có chỗ nào gọi method tìm kiếm của cậu, cậu đang đùa tất cả mọi người ở đây có phải không?


Tớ nghĩ cậu cần học cách debug nghiêm túc đi. Dưới đây là một số cách.

  1. Cách 1: Cậu biết dùng System.out.println rồi, cậu chỉ cần in ra từng biến một xem nội dung nó là gì là xong.
    Cậu sẽ chỉ mất vài giờ để khoanh vùng và tìm kiếm, so với mấy ngày đi lần mò ở đoạn code không có vấn đề gì cả.
  2. Cách 2: Xóa dần từng dòng code cho tới khi lỗi của cậu biến mất.
    Dòng xóa cuối cùng sẽ là dòng gây lỗi. Cậu cũng chỉ tốn mấy giờ cho việc này thôi.
  3. Cách 3: Học cách dùng debugger của IDE như IntelliJ hay Eclipse.
    Debugger sẽ cho cậu chạy qua từng dòng, in hết nội dung các biến ra cho cậu.
    Công học debugger chắc mất vài giờ thôi.

Cậu tự khoanh vùng lỗi trước, rồi post cập nhật lên đây nhé! Tự đi bắt cá đi, tớ không bón cho cậu nữa đâu.

3 Likes

Chà, bây giờ thì mình đang chả biết bạn “trộn” chung tênmã nhân viên hay không. Thấy bạn nhập toàn là số 1 nhưng mấy câu thông báo toàn là nhập tên.
Cuối cùng thì bạn gán tên"1" sau đó đi tìm mã nhân viên có giá trị là 1.
Nếu mã nhân viên là tự tăng thì bạn thực hiện việc đó thế nào? Tăng từ số mấy?

Bạn chạy chế độ gỡ lỗi (debug) rồi xem những thứ bạn nhập vào staffList đã đúng chưa. Đảm bảo khâu nhập cho 3 loại nhân viên của bạn có vấn đề, nên tên, mã, … nó lung tung, không chính xác như những gì bạn muốn.

3 Likes

Thực sự thì phần code bạn show lên sau khi update ít có khả năng gây lỗi, mà nhiều khả năng là lỗi xuất phát từ núi code còn lại của bạn. Tốt nhất là bạn nên debug từng tý một xem lỗi nó đến từ đâu thì fix chỗ đó rồi sửa tận gốc chứ bây giờ mọi người cũng hoang mang rồi

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?