HashMap - nhận giá trị Khóa đầu tiên


129

Dưới đây là các giá trị có trong HashMap

statusName {Active=33, Renewals Completed=3, Application=15}

Mã Java để nhận được Khóa đầu tiên (tức là Hoạt động)

Object myKey = statusName.keySet().toArray()[0];

Làm thế nào chúng ta có thể thu thập Khóa đầu tiên "Giá trị" (tức là 33), tôi muốn lưu trữ cả "Khóa" và "Giá trị" trong biến riêng biệt.


9
Bạn có nhận ra rằng HashMapcác mục nhập không có thứ tự, và vì vậy "đầu tiên" có thể thay đổi bất cứ khi nào bạn sửa đổi bản đồ?
NPE

1
Bạn có hiểu rằng không có thứ tự cụ thể trong một HashMap? Nếu bạn sửa đổi nó, bạn có thể nhận được kết quả theo một thứ tự hoàn toàn khác.
Jon Skeet

Không, thứ tự không được đảm bảo từ chạy đến chạy, nhưng trong cùng một chuỗi, có thể dựa vào thứ tự.
hd1

1
@JonSkeet Thực ra đây là một câu hỏi thực sự hợp lệ. Trong Groovy, có rất nhiều trường hợp bạn lấy lại một cấu trúc giống như một danh sách các bản đồ, mỗi bản đồ có một mục nhập duy nhất. Cho đến nay tôi vẫn chưa tìm ra cách dễ dàng / hiển nhiên (Groovy) để in ra tất cả các giá trị. Nếu các khóa không đổi, thì dễ dàng như collection.each {println it.key} để in ra từng giá trị, nhưng không có các khóa hằng số thì điều đó không rõ ràng, nhưng collection.each {println it.values ​​() [0]} hoạt động ( Một số câu trả lời được sàng lọc ở đây ...).
Bill K

@BillK: Nếu bạn biết mỗi bản đồ có chính xác một mục nhập, thì đó thực sự là một câu hỏi khác và một câu hỏi có ý nghĩa hơn.
Jon Skeet

Câu trả lời:


251

Bạn có thể thử điều này:

 Map<String,String> map = new HashMap<>();
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key = entry.getKey();
 String value = entry.getValue();

Hãy ghi nhớ, HashMapkhông đảm bảo thứ tự chèn. Sử dụng a LinkedHashMapđể giữ nguyên đơn đặt hàng.

Ví dụ:

 Map<String,String> map = new LinkedHashMap<>();
 map.put("Active","33");
 map.put("Renewals Completed","3");
 map.put("Application","15");
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key= entry.getKey();
 String value=entry.getValue();
 System.out.println(key);
 System.out.println(value);

Đầu ra:

 Active
 33

Tôi biết đây là một câu trả lời rất cũ .. điều này đang hoạt động cho các bản đồ băm với khóa và giá trị dưới dạng chuỗi. nhưng khi cố gắng cùng với đối tượng cho một giá trị nhận được lỗi đúc: com.google.gson.internal.LinkedTreeMap cannot be cast to...... lớp học của tôi mà tôi nói thay vì Stringở đúng nơi ... không thể tìm thấy câu trả lời online..help
Xanh Bot

@darthydarth, bạn nên sử dụng loại phù hợp dựa trên ngữ cảnh của bạn.
Ruchira Gayan Ranaweera

đầu tiên siêu cảm ơn vì đã trả lời! Tôi không mong đợi điều đó ... thứ hai, tôi nhận thấy rằng có vấn đề với Generics không được lưu trong thời gian chạy. cuối cùng tôi đã hack xung quanh nó bằng cách sử dụng Gsonđể chuyển đổi đối tượng giá trị thành a Stringvà sau đó phân tích cú pháp nó trở lại loại lớp của tôi. Nó xấu xí nhưng tôi thực sự không thể tìm thấy bất kỳ giải pháp khác để cái gì đó là dễ dàng như vậy để làm trong các ngôn ngữ khác (Tôi learing Java bây giờ)
Xanh Bot

chắc chắn nhưng làm thế nào? nó quá nhiều cho phần ý kiến
Xanh Bot

@darthydarth bạn có thể gửi email cho tôi. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

Để nhận giá trị "đầu tiên":

map.values().toArray()[0]

Để nhận giá trị của khóa "đầu tiên":

map.get(map.keySet().toArray()[0])

Lưu ý: Đoạn mã trên đã được thử nghiệm và hoạt động.

Tôi nói "đầu tiên" vì các mục nhập HashMap không có thứ tự.

Tuy nhiên, một LinkedHashMap lặp lại các mục nhập của nó theo thứ tự như khi chúng được chèn - bạn có thể sử dụng nó để triển khai bản đồ của mình nếu thứ tự chèn là quan trọng.


trước tiên bạn cần kiểm tra xem bản đồ có trống không
ACV

48

Cách hoạt động của Java 8,

String firstKey = map.keySet().stream().findFirst().get();


nếu chúng ta có khóa, hãy truy xuất giá trị đầu tiên bằng map.get (firstKey). Chỉ là một gợi ý. :)
Upen

7

Bạn cũng có thể thử điều này để nhận toàn bộ mục nhập đầu tiên,

Map.Entry<String, String> entry = map.entrySet().stream().findFirst().get();
String key = entry.getKey();
String value = entry.getValue();

Điều này để chỉ lấy khóa của mục nhập đầu tiên,

String key = map.entrySet().stream().map(Map.Entry::getKey).findFirst().get();
// or better
String key = map.keySet().stream().findFirst().get();

Điều này để chỉ nhận giá trị của mục nhập đầu tiên,

String value = map.entrySet().stream().map(Map.Entry::getValue).findFirst().get();
// or better
String value = map.values().stream().findFirst().get();

Hơn nữa, trong trường hợp bạn biết mình đang làm gì và bạn muốn nhận được vật phẩm thứ hai (tương tự cho thứ ba, v.v.) của bản đồ, bạn nên thử cách này,

Map.Entry<String, String> entry = map.entrySet().stream().skip(1).findFirst().get();
String key = map.keySet().stream().skip(1).findFirst().get();
String value = map.values().stream().skip(1).findFirst().get();

4

làm cách nào chúng ta có thể thu thập "Giá trị" của Khóa đầu tiên (tức là 33)

Bằng cách sử dụng youMap.get(keyYouHave), bạn có thể nhận được giá trị của nó.

muốn lưu trữ Cả "Khóa" và "Giá trị" trong biến riêng biệt

Có, bạn có thể gán giá trị đó cho một biến.

Chờ đã ......... nó chưa kết thúc.

Nếu bạn (logic kinh doanh) phụ thuộc vào thứ tự chèn và truy xuất, bạn sẽ thấy những kết quả kỳ lạ. Bản đồ không được đặt hàng, họ sẽ không lưu trữ theo thứ tự. Hãy nhận thức về thực tế đó. Sử dụng một số thay thế để duy trì đơn đặt hàng của bạn. Có lẽ là mộtLinkedHashMap


2

Lưu ý rằng bạn cần lưu ý rằng luồng logic của bạn không bao giờ được dựa vào việc truy cập các HashMapphần tử theo một số thứ tự, đơn giản là vì HashMapcác s không được sắp xếp theo thứ tự Collectionvà đó không phải là những gì chúng nhằm mục đích làm. (Bạn có thể đọc thêm về các bộ sưu tập được tạo mùi và sắp xếp trong bài đăng này ).

Quay lại bài đăng, bạn đã thực hiện một nửa công việc bằng cách tải khóa phần tử đầu tiên:

Object myKey = statusName.keySet().toArray()[0];

Chỉ cần gọi map.get(key)để nhận giá trị tương ứng:

Object myValue = statusName.get(myKey);

1

Hãy nhớ rằng nói chung thứ tự chèn không được tôn trọng trong bản đồ. Thử cái này :

    /**
     * Get the first element of a map. A map doesn't guarantee the insertion order
     * @param map
     * @param <E>
     * @param <K>
     * @return
     */
    public static <E,K> K getFirstKeyValue(Map<E,K> map){
        K value = null;
        if(map != null && map.size() > 0){
            Map.Entry<E,K> entry =  map.entrySet().iterator().next();
            if(entry != null)
                value = entry.getValue();
        }
        return  value;
    }

Tôi chỉ sử dụng điều này khi tôi chắc chắn rằng map.size() == 1.


1

Cải thiện câu trả lời của whoami. Vì findFirst()trả về an Optional, nên bạn nên kiểm tra xem có giá trị nào không.

 var optional = pair.keySet().stream().findFirst();

 if (!optional.isPresent()) {
    return;
 }

 var key = optional.get();

Ngoài ra, một số nhận xét rằng việc tìm kiếm khóa đầu tiên của a HashSetlà không đáng tin cậy. Nhưng đôi khi chúng ta có HashMapđôi có cặp; tức là trong mỗi bản đồ chúng ta có một khóa và một giá trị. Trong những trường hợp như vậy, việc tìm kiếm khóa đầu tiên của một cặp như vậy một cách nhanh chóng rất tiện lợi.


0

Cũng là một cách hay để làm điều này :)

Map<Integer,JsonObject> requestOutput = getRequestOutput(client,post);
int statusCode = requestOutput.keySet().stream().findFirst().orElseThrow(() -> new RuntimeException("Empty"));

-2

Bạn cũng có thể thử bên dưới:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);

1
Không có phương pháp nào như vậy
Adrian Grygutis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.