Chào mọi người. Em có làm 1 bài tập nhỏ đó là làm việc thêm xóa sửa các Slang(ví dụ key là :3 thì nó có value là kute). E có sử dụng thêm java swing. Vì làm việc cùng lúc nhiều class nên biến lưu trữ [key,value]
em đặt biến static.
private static Map<String, ArrayList<String>> multiMap = new HashMap<String, ArrayList<String>>();
Em có thao tác đó là thêm 1 dữ liệu slang. Nếu nó trùng thì em sẽ thêm giá trị value vào.
Em nhận thấy. Nếu thêm một slang, đồng nghĩa với việc thêm một cặp [key,value]
thì khi em tìm cặp [key,value]
đó thì em sẽ tìm được. Em đoán rằng. Do multiMap
là static
nhưng do ArrayList
không tĩnh nên nếu ta chỉ thay đổi giá trị của arrayList thôi thì khi truy cập ở chỗ khác nó sẽ không được cập nhật. Nên với trường hợp nhập trùng key, em chọn cách xóa key cũ và thêm mới lại.
String[] valueStrings = null;
if(value.length() > 0){
valueStrings = value.split("[|]");
for(int i = 0; i <valueStrings.length; i++){
valueStrings[i] = valueStrings[i].trim();
}
}
if(choose == 0){ // 0 nghĩa là thêm mới
Slang.multiMap.put(NewSlangs, new ArrayList<>());
Slang.multiMap.get(NewSlangs).addAll(Arrays.asList(valueStrings));
}
else if(choose == 2){ // 2 nghĩa là thêm value
ArrayList<String> tempArrayList = new ArrayList<>();// em dang bug nên sửa tạm, mọi
//người bỏ qua nhé.
tempArrayList.addAll(multiMap.get(NewSlangs));
tempArrayList.addAll(Arrays.asList(valueStrings));
Slang.multiMap.remove(NewSlangs);
Slang.multiMap.put(NewSlangs, tempArrayList);
}
Sau khi gặp lỗi là với thêm mới key,value thì khi tìm lại thì sẽ tìm được. Nhưng với chèn thêm value thì lại không. Nên em debug và có một số vấn đề ở đây.
Khi thêm mới.
Địa chỉ
ArrayList
mà em thêm mới là #1893
Khi tìm lại cặp
[Key,Value]
này, địa chỉ ArrayList
của value cũng là #1893
Và em tìm được.
Nhưng khi thêm value
ArrayList
cũ chứa các value cũ có địa chỉ là #2050
Các string nó chứa có các địa chỉ tăng dần là
#10177, #10178,...
ArrayList
mới chứa các value mới có địa chỉ là #2088
Sau khi addAll thì
ArrayList
mới này chứa đúng địa chỉ các String
mà Array
cũ đã chứa và chứa thêm địa chỉ của String
mới.
Nhưng khi tìm nó thì nó chỉ có chứa 4 value cũ
và địa chỉ của nó cũng khác luôn.
Vậy mọi người cho em hỏi lý do vì sao và cách khắc phục ạ. Em xin cảm ơn