2016-02-09 25 views
8

Tôi muốn tạo biểu đồ bằng cách sử dụng HashMap, khóa phải là độ trễ, giá trị số lần trễ này xảy ra. Tôi nghi ngờ sử dụng chức năng HashMapreplace hoặc HashMapput nếu độ trễ hiện có có sự xuất hiện mới.Sự khác biệt giữa thay thế và đặt cho HashMap

tôi đã làm nó bằng cách này

int delay = (int) (loopcount-packetServed.getArrivalTime()); 
if(histogramType1.containsKey(delay)) 
{ 
    histogramType1.replace(delay, histogramType1.get(delay)+1); 
} 
else 
{ 
    histogramType1.put(delay, 1); 
} 

là đúng này? hoặc tôi nên sử dụng hai lần hàm put?

+1

[Thay] (https://docs.oracle.com/javase/8/docs/api/java/util/HashMap .html # replace-KV-) "Thay thế mục nhập cho khóa được chỉ định nếu nó hiện được ánh xạ tới một số giá trị" –

+0

Vì vậy, tôi nên giữ giải pháp thay thế? – StudentX

+1

Nó không quan trọng trong trường hợp đó vì nếu phần tử tồn tại, nó sẽ có kết quả tương tự như 'put' anyways - vì' containsKey' được sử dụng 'replace' chỉ được gọi nếu có ánh xạ. – Thomas

Trả lời

2

Trong trường hợp của bạn, vì trước tiên bạn kiểm tra xem giá trị có được chứa trong bản đồ hay không, sử dụng put hoặc replace dẫn đến cùng một kết quả.

Bạn cũng có thể sử dụng, dựa trên nội dung dễ đọc hơn đối với bạn.

11

Hoàn toàn không có sự khác biệt trong putreplace khi có bản đồ hiện tại cho khóa mong muốn. Từ replace:

Thay thế mục nhập cho khóa được chỉ định nếu nó hiện được ánh xạ tới một số giá trị.

Điều này có nghĩa là nếu đã có ánh xạ cho khóa đã cho, cả hai putreplace sẽ cập nhật bản đồ theo cùng một cách. Cả hai cũng sẽ trả lại giá trị trước đó được liên kết với khóa. Tuy nhiên, nếu không có ánh xạ cho khóa đó, thì replace sẽ là một no-op (sẽ không làm gì cả) trong khi put sẽ vẫn cập nhật bản đồ.


Bắt đầu với Java 8, lưu ý rằng bạn chỉ có thể sử dụng

histogramType1.merge(delay, 1, Integer::sum); 

này sẽ chăm sóc mọi điều kiện. Từ merge:

Nếu khóa chỉ định không được kết hợp với một giá trị hoặc có liên quan đến null, liên kết nó với các giá trị null không nhất định. Nếu không, thay thế giá trị được kết hợp bằng kết quả của hàm remapping đã cho hoặc loại bỏ nếu kết quả là null.

Trong trường hợp này, chúng tôi đang tạo mục nhập delay -> 1 nếu mục nhập không tồn tại. Nếu nó tồn tại, nó được cập nhật bằng cách tăng giá trị lên 1.

1

Nếu bạn nhìn vào các nguồn mà bạn có thể thấy như sau (đây là từ bản cập nhật 11 nhưng có lẽ đã không thay đổi nhiều):

thay:

if ((e = getNode(hash(key), key)) != null) { 
    V oldValue = e.value; 
    e.value = value; 
    afterNodeAccess(e); 
    return oldValue; 
}  

đặt (nội bộ method putVal):

//some code before this to find the node e (similar to getNode(hash(key))) 
if (e != null) { // existing mapping for key 
    V oldValue = e.value; 
    if (!onlyIfAbsent || oldValue == null) //onlyIfAbsent is false here 
    e.value = value; 
    afterNodeAccess(e); 
    return oldValue; 
} 

Như bạn thấy, các phần liên quan của mã làm cơ bản đồng minh cùng một điều kể từ onlyIfAbsent là sai cho put và do đó sẽ luôn thay thế giá trị.

0

Bạn có thể xác minh hành vi những người khác đã được mô tả, với điều này:

public class Main { 
    public static void main(String[] args) { 
     Map<String, String> map = new HashMap<>(); 
     map.replace("a", "1"); 
     System.out.println(map.get("a")); 

     map.put("a", "1"); 
     System.out.println(map.get("a")); 

     map.replace("a", "2"); 
     System.out.println(map.get("a")); 
    } 
} 
Các vấn đề liên quan