HashMap‹String, Integer› ค้นหาส่วนหนึ่งของคีย์หรือไม่ [ทำซ้ำ]

ขณะนี้ฉันกำลังใช้ HashMap<String, Integer> ซึ่งเต็มไปด้วยคีย์ประเภท String ซึ่งทั้งหมดมีความยาว 5 ตัวอักษร ฉันจะค้นหาคีย์เฉพาะที่มีขนาด 4 ตัวอักษรหรือน้อยกว่า ซึ่งเป็นส่วนหนึ่งและที่จุดเริ่มต้นของคีย์อื่นๆ และรับ Hit ทั้งหมดเป็นชุดของ <Key, Value> ได้อย่างไร


person VoidStar    schedule 21.05.2013    source แหล่งที่มา
comment
คุณต้องวนซ้ำ HashMap ทั้งหมด ใช้ getKey.length() และเพิ่มหรือไม่ (ขึ้นอยู่กับเงื่อนไข) ให้กับ List<>   -  person Javier Diaz    schedule 21.05.2013
comment
คุณเคยดูที่ keySet() บ้างไหม?   -  person vikingsteve    schedule 21.05.2013
comment
มันยากเกินไปที่จะแก้ปัญหาหรือไม่ ถ้าใช่สำหรับคุณ อย่างน้อยก็แบ่งปันสิ่งที่คุณได้ลองไปแล้ว?   -  person Juned Ahsan    schedule 21.05.2013
comment
สิ่งที่คุณกำลังมองหาเรียกว่า Trie   -  person Thomas Jungblut    schedule 21.05.2013
comment
คำถาม: เขากำลังมองหารายการที่มี 4 ตัวอักษรแทนที่จะเป็น 5 ตัวอักษร? หรือเขากำลังมองหาชุดอักขระ 4 ตัวซึ่งอาจมีอักขระไม่เกิน 5 ตัว?   -  person Menelaos    schedule 21.05.2013
comment
ฉันแก้ไขคำถามของฉัน ตอนนี้มันควรจะชัดเจนแล้ว   -  person VoidStar    schedule 21.05.2013
comment
@Machtl เป็นอักขระ 4 ตัวที่จุดเริ่มต้นหรือจุดสิ้นสุดของสตริง)? พวกเขาสามารถอยู่ที่ไหนสักแห่งในสตริงได้หรือไม่?   -  person Menelaos    schedule 21.05.2013


คำตอบ (8)


วนซ้ำเป็นตัวเลือกเดียวของคุณ เว้นแต่คุณจะสร้างโครงสร้างข้อมูลที่กำหนดเอง:

for (Entry<String, Integer> e : map.entrySet()) {
    if (e.getKey().startsWith("xxxx")) {
        //add to my result list
    }
}

หากคุณต้องการบางสิ่งบางอย่างที่มีประสิทธิภาพมากขึ้น คุณจะต้องมีการใช้งานแผนที่ซึ่งคุณกำลังติดตามคีย์บางส่วนเหล่านี้

person cyborg    schedule 21.05.2013

ดูเหมือนว่าจะเป็นกรณีการใช้งานสำหรับ TreeMap แทนที่จะเป็น HashMap ข้อแตกต่างคือ TreeMap รักษาความสงบเรียบร้อย ดังนั้นคุณจึงสามารถค้นหาการจับคู่บางส่วนของคุณได้รวดเร็วยิ่งขึ้น คุณไม่จำเป็นต้องผ่านแผนที่ทั้งหมด

ตรวจสอบคำถามนี้ การค้นหาบางส่วนใน HashMap

person Ondrej Bozek    schedule 21.05.2013

คุณไม่สามารถทำได้ผ่าน HashMap คุณควรเขียนการใช้งานของคุณเองสำหรับ Map เพื่อใช้การค้นหาตามความยาวสตริงในแผนที่

person harsh    schedule 21.05.2013
comment
เว้นแต่ว่าเขาจะเปลี่ยนข้อกำหนด ใช้คีย์ที่มีอักขระเพียง 4 ตัว และเก็บข้อมูลอื่นๆ ไว้ในออบเจ็กต์ตามค่า อีกทางเลือกหนึ่งคือการใช้ Key Object แบบกำหนดเองพร้อมเมธอด hashCode() แบบกำหนดเอง - person Menelaos; 21.05.2013
comment
ฉันไม่แนะนำให้กลิ้ง Map‹› ของตัวเอง นั่นอาจมากเกินไป (และนอกจากนี้ การเรียบเรียงมักจะดีกว่าการสืบทอด) อย่างไรก็ตาม ฉันยอมรับว่าโครงสร้างข้อมูลตามที่เป็นอยู่ไม่ได้ออกแบบมาเพื่อการทำเช่นนี้ - person Michael Aaron Safyan; 21.05.2013
comment
คุณไม่จำเป็นต้องติดตั้ง Map ทั้งหมด มันค่อนข้างง่ายที่จะเพิ่มสิ่งของพิเศษหากคุณใช้ลวดลายมัณฑนากร ตัวอย่างเช่น ฉันต้องการออกจากระบบทุกคีย์ที่เพิ่มลงในแผนที่ ได้เลย ฉันกำหนดให้ LoggingMap ใช้ Map จากนั้นคุณต้องระบุอินสแตนซ์ที่แท้จริงของแผนที่ที่จะออกจากระบบ ซึ่งจะทำงานได้ดีอย่างสมบูรณ์ในกรณีนี้ ยกเว้นแทนที่จะบันทึก คุณจะติดตามคีย์ที่คุณต้องการในรายการหรือบางอย่างในบรรทัดเหล่านั้น - person cyborg; 21.05.2013
comment
ใช่ การใช้งาน 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

person André Stannek    schedule 21.05.2013

Set<Entry<String, Integer>> s1 = map.entrySet();
    for (Entry<String, Integer> entry : s1) {
          if(entry.getKey().length == 4)
          //add it to a map;
}

ขั้นแรกให้ตั้งค่ารายการเป็นแฮชแมปของคุณ วนซ้ำชุดและตรวจสอบความยาวของแต่ละคีย์และเพิ่มลงในแผนที่หรือใช้ตามที่คุณต้องการ

person Adarsh    schedule 21.05.2013

ด้วย HashMap<String, Integer> คุณสามารถผ่าน keySet() และทำ contains() สำหรับคีย์ String และรูปแบบของคุณเท่านั้น

person pbespechnyi    schedule 21.05.2013

ตามที่ระบุไว้ ไม่มีวิธีที่มีประสิทธิภาพ* มากนักในการดำเนินการกับโครงสร้างข้อมูลที่คุณระบุ อย่างไรก็ตาม หากคุณเพิ่ม Map<Integer, List<String>> เพิ่มเติมเพื่อติดตามการแมปตั้งแต่ความยาวสตริงไปจนถึงรายการคีย์ทั้งหมดที่มีความยาวนั้น คุณจะสามารถดำเนินการนี้ได้อย่างมีประสิทธิภาพมาก

*การใช้เพียง Map‹String, Integer› คุณจะต้องวนซ้ำความจุทั้งหมดของแผนที่ขนาดใหญ่ ในขณะที่การเพิ่มโครงสร้างข้อมูลเสริมนี้จะกำหนดให้มีการค้นหา O(1) (สมมติว่าคุณใช้ HashMap) ตามด้วยการวนซ้ำผ่านเพียง ชุดผลลัพธ์ซึ่งเป็นผลลัพธ์ที่เร็วที่สุดเท่าที่จะเป็นไปได้

person Michael Aaron Safyan    schedule 21.05.2013

คุณสามารถลองใช้วิธีนี้:

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;
    }
person Shreyos Adikari    schedule 21.05.2013