ขณะนี้ฉันกำลังใช้ HashMap<String, Integer>
ซึ่งเต็มไปด้วยคีย์ประเภท String
ซึ่งทั้งหมดมีความยาว 5 ตัวอักษร ฉันจะค้นหาคีย์เฉพาะที่มีขนาด 4 ตัวอักษรหรือน้อยกว่า ซึ่งเป็นส่วนหนึ่งและที่จุดเริ่มต้นของคีย์อื่นๆ และรับ Hit ทั้งหมดเป็นชุดของ <Key, Value>
ได้อย่างไร
HashMap‹String, Integer› ค้นหาส่วนหนึ่งของคีย์หรือไม่ [ทำซ้ำ]
คำตอบ (8)
วนซ้ำเป็นตัวเลือกเดียวของคุณ เว้นแต่คุณจะสร้างโครงสร้างข้อมูลที่กำหนดเอง:
for (Entry<String, Integer> e : map.entrySet()) {
if (e.getKey().startsWith("xxxx")) {
//add to my result list
}
}
หากคุณต้องการบางสิ่งบางอย่างที่มีประสิทธิภาพมากขึ้น คุณจะต้องมีการใช้งานแผนที่ซึ่งคุณกำลังติดตามคีย์บางส่วนเหล่านี้
ดูเหมือนว่าจะเป็นกรณีการใช้งานสำหรับ TreeMap
แทนที่จะเป็น HashMap
ข้อแตกต่างคือ TreeMap รักษาความสงบเรียบร้อย ดังนั้นคุณจึงสามารถค้นหาการจับคู่บางส่วนของคุณได้รวดเร็วยิ่งขึ้น คุณไม่จำเป็นต้องผ่านแผนที่ทั้งหมด
ตรวจสอบคำถามนี้ การค้นหาบางส่วนใน HashMap
คุณไม่สามารถทำได้ผ่าน HashMap
คุณควรเขียนการใช้งานของคุณเองสำหรับ Map
เพื่อใช้การค้นหาตามความยาวสตริงในแผนที่
Map
ที่ถูกต้องสามารถเป็นส่วนขยาย (extends
) ของ HashMap
หรือการใช้งานที่กำลังออกอื่นๆ ได้ แทนที่เฉพาะสิ่งที่จำเป็นเท่านั้น ประเด็นของฉันคือสำหรับคำถามนี้ Map
ดูเหมือนจะเป็นโครงสร้างข้อมูลที่ถูกต้อง แต่มีการแก้ไขบางอย่าง get
(สำหรับการดึงข้อมูลตามความยาว) และใส่ (เพื่อให้พูดได้ดีที่สุด O(1)
อีกครั้ง) เนื่องจากคำตอบอื่น ๆ ทั้งหมดแสดงตรรกะภายนอกเป็นวิธีแก้ปัญหา การมี Map
เฉพาะเจาะจงจะบังคับใช้การห่อหุ้มตรรกะนั้นภายในแผนที่เอง
- person harsh; 21.05.2013
Map<String, Integer> result = new HashMap<String, Integer>;
for(String key : yourMap.keySet()) {
if(key.length() == 4){
result.put(key, yourMap.get(key);
}
}
หลังจากรันโค้ดนี้ คุณจะมีคู่คีย์/ค่าทั้งหมดที่มีคีย์ตัวอักษร 4 ตัวใน result
Set<Entry<String, Integer>> s1 = map.entrySet();
for (Entry<String, Integer> entry : s1) {
if(entry.getKey().length == 4)
//add it to a map;
}
ขั้นแรกให้ตั้งค่ารายการเป็นแฮชแมปของคุณ วนซ้ำชุดและตรวจสอบความยาวของแต่ละคีย์และเพิ่มลงในแผนที่หรือใช้ตามที่คุณต้องการ
ด้วย HashMap<String, Integer>
คุณสามารถผ่าน keySet()
และทำ contains()
สำหรับคีย์ String
และรูปแบบของคุณเท่านั้น
ตามที่ระบุไว้ ไม่มีวิธีที่มีประสิทธิภาพ* มากนักในการดำเนินการกับโครงสร้างข้อมูลที่คุณระบุ อย่างไรก็ตาม หากคุณเพิ่ม Map<Integer, List<String>>
เพิ่มเติมเพื่อติดตามการแมปตั้งแต่ความยาวสตริงไปจนถึงรายการคีย์ทั้งหมดที่มีความยาวนั้น คุณจะสามารถดำเนินการนี้ได้อย่างมีประสิทธิภาพมาก
*การใช้เพียง Map‹String, Integer› คุณจะต้องวนซ้ำความจุทั้งหมดของแผนที่ขนาดใหญ่ ในขณะที่การเพิ่มโครงสร้างข้อมูลเสริมนี้จะกำหนดให้มีการค้นหา O(1) (สมมติว่าคุณใช้ HashMap) ตามด้วยการวนซ้ำผ่านเพียง ชุดผลลัพธ์ซึ่งเป็นผลลัพธ์ที่เร็วที่สุดเท่าที่จะเป็นไปได้
คุณสามารถลองใช้วิธีนี้:
public Map<String,Integer> filterMap(Map<String, Integer> inputMap){
Map<String, Integer> resultHashMap = new HashMap<String, Integer>();
for (String key : inputMap.keySet()) {
if(key.length()==5){
resultHashMap.put(key,inputMap.get(key));
}
}
return resultHashMap;
}
getKey.length()
และเพิ่มหรือไม่ (ขึ้นอยู่กับเงื่อนไข) ให้กับList<>
- person Javier Diaz   schedule 21.05.2013keySet()
บ้างไหม? - person vikingsteve   schedule 21.05.2013Trie
- person Thomas Jungblut   schedule 21.05.2013