คำถามติดแท็ก collections

6
ทำไม Java 8 ถึงไม่รวมคอลเลกชันที่ไม่เปลี่ยนรูป?
ทีมงาน Java ได้ทำงานอย่างยอดเยี่ยมในการขจัดอุปสรรคในการเขียนโปรแกรมการทำงานใน Java 8 โดยเฉพาะอย่างยิ่งการเปลี่ยนแปลงของ java.util Collections ทำหน้าที่ได้อย่างยอดเยี่ยมในการแปลงสายสัมพันธ์ให้เป็นการดำเนินการที่รวดเร็วมาก เมื่อพิจารณาว่างานที่พวกเขาทำเพิ่มฟังก์ชันชั้นหนึ่งและวิธีการทำงานในคอลเลกชันได้ดีเพียงใดทำไมพวกเขาถึงล้มเหลวในการจัดหาคอลเลกชันที่ไม่เปลี่ยนรูปแบบหรือแม้แต่อินเตอร์เฟสคอลเล็กชันที่ไม่เปลี่ยนรูปแบบโดยสิ้นเชิง โดยไม่ต้องเปลี่ยนรหัสใด ๆ ที่มีอยู่ทีม Java สามารถเพิ่มอินเทอร์เฟซที่ไม่เปลี่ยนรูปได้ซึ่งเป็นอินเทอร์เฟซที่ไม่เปลี่ยนรูปได้ลบเมธอด "set" และทำให้อินเตอร์เฟสที่มีอยู่ขยายออกจากพวกเขาเช่นนี้ ImmutableIterable ____________/ | / | Iterable ImmutableCollection | _______/ / \ \___________ | / / \ \ Collection ImmutableList ImmutableSet ImmutableMap ... \ \ \_________|______________|__________ | \ \___________|____________ | \ | \___________ | …

9
การเปลี่ยนแปลงไม่ได้จะคุ้มค่ามากหรือไม่เมื่อไม่มีการเห็นพ้องด้วย?
ดูเหมือนว่าความปลอดภัยของเธรดมักถูกกล่าวถึงบ่อยครั้งว่าเป็นประโยชน์หลักของการใช้ประเภทที่ไม่เปลี่ยนรูปและโดยเฉพาะอย่างยิ่งคอลเลกชัน ฉันมีสถานการณ์ที่ฉันต้องการตรวจสอบให้แน่ใจว่าวิธีการจะไม่แก้ไขพจนานุกรมสตริง (ซึ่งไม่เปลี่ยนรูปใน C #) ฉันต้องการ จำกัด สิ่งต่าง ๆ ให้มากที่สุด อย่างไรก็ตามฉันไม่แน่ใจว่าการเพิ่มการพึ่งพาแพ็คเกจใหม่ (Microsoft Immutable Collections) นั้นคุ้มค่าหรือไม่ ประสิทธิภาพไม่ใช่ปัญหาใหญ่เช่นกัน ดังนั้นฉันเดาว่าคำถามของฉันคือการแนะนำให้สะสมอย่างไม่เปลี่ยนรูปแบบเมื่อไม่มีข้อกำหนดเรื่องประสิทธิภาพการทำงานที่หนักหน่วงและไม่มีปัญหาเรื่องความปลอดภัยของเธรดหรือไม่? พิจารณาความหมายที่มีค่า (ตามตัวอย่างของฉัน) อาจจะใช่หรือไม่ใช่ข้อกำหนดก็ได้เช่นกัน

6
การปฏิบัติที่ดีหรือไม่ดีในการซ่อนคอลเลกชัน Java ด้วยชื่อคลาสที่มีความหมาย?
เมื่อเร็ว ๆ นี้ฉันเคยติดนิสัยคอลเลกชัน Java "กำบัง" ที่มีชื่อคลาสที่เป็นมิตรกับมนุษย์ ตัวอย่างง่ายๆ: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } หรือ: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // run away screaming, or would you actually understand what …

8
ทำไม java.util.ArrayList อนุญาตให้เพิ่ม null?
ผมสงสัยว่าทำไมช่วยให้การเพิ่มjava.util.ArrayList nullมีกรณีใดที่ฉันต้องการที่จะเพิ่มnullไปยังArrayList? ฉันถามคำถามนี้เพราะในโครงการเรามีข้อผิดพลาดที่มีการเพิ่มรหัสบางส่วนnullลงไปArrayListและมันก็ยากที่จะทราบว่าจุดบกพร่องนั้นอยู่ที่ไหน เห็นได้ชัดว่าNullPointerExceptionถูกโยน แต่ไม่จนกว่ารหัสอื่นพยายามเข้าถึงองค์ประกอบ ปัญหาคือวิธีการค้นหารหัสที่เพิ่มnullวัตถุ มันจะง่ายกว่านี้หากArrayListมีข้อยกเว้นในรหัสที่มีการเพิ่มองค์ประกอบ

9
ฉันควรยอมรับคอลเลกชันที่ว่างเปล่าในวิธีการของฉันที่ทำซ้ำมากกว่าพวกเขา
ฉันมีวิธีการที่ตรรกะทั้งหมดจะดำเนินการภายในวง foreach ที่ iterates มากกว่าพารามิเตอร์ของวิธีการ: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } ในกรณีนี้การส่งคอลเล็กชันว่างเปล่าจะส่งผลให้เกิดคอลเล็กชันที่ว่างเปล่า แต่ฉันสงสัยว่ามันไม่ฉลาด ตรรกะของฉันที่นี่คือถ้าใครบางคนกำลังเรียกวิธีนี้พวกเขาตั้งใจจะส่งผ่านข้อมูลและจะส่งเฉพาะคอลเลกชันที่ว่างเปล่าไปยังวิธีการของฉันในสถานการณ์ที่ผิดพลาด ฉันควรจะตรวจจับพฤติกรรมนี้และทิ้งข้อยกเว้นไว้หรือเป็นวิธีที่ดีที่สุดในการส่งคืนคอลเลกชันที่ว่างเปล่า?

6
ฉันต้องการเขียนอัลกอริทึม "ultimate shuffle" เพื่อเรียงลำดับคอลเลกชัน mp3 ของฉัน
ฉันกำลังมองหาข้อเสนอแนะ pseudocode สำหรับจัดเรียงไฟล์ mp3 ของฉันในทางที่หลีกเลี่ยงชื่อและศิลปินซ้ำ ฉันฟัง crooners - Frank Sinatra, Tony Bennett, Ella Fitzgerald ฯลฯ ร้องเพลงมาตรฐานเก่า ศิลปินแต่ละคนบันทึกเพลงเดียวกันหลายเพลง - Fly Me To The Moon, The Way You Look Tonight, Stardust ฯลฯ เป้าหมายของฉันคือการจัดเรียงเพลง (หรือสั่งซื้อเพลย์ลิสต์) ด้วยพื้นที่สูงสุดระหว่างศิลปินและชื่อเพลง ดังนั้นถ้าฉันมี 2,000 เพลงและ 20 เพลงเป็นโดยเอลล่าฉันอยากจะได้ยินเธอเพียงครั้งเดียวในทุก ๆ 100 เพลง หากศิลปิน 10 คนร้องเพลง Fly Me To The Moon ฉันอยากได้ยินทุก …

2
Java: ทำไมคอลเลกชันถึงรับตัวเปรียบเทียบ แต่ไม่ใช่ (สมมุติ) Hasher and Equator?
ปัญหานี้ชัดเจนที่สุดเมื่อคุณมีการใช้อินเทอร์เฟซที่แตกต่างกันและสำหรับวัตถุประสงค์ของคอลเลกชันเฉพาะคุณสนใจเฉพาะมุมมองระดับอินเทอร์เฟซของวัตถุ ตัวอย่างเช่นสมมติว่าคุณมีอินเทอร์เฟซเช่นนี้: public interface Person { int getId(); } วิธีปกติในการใช้งานhashcode()และequals()ในชั้นเรียนการใช้งานจะมีรหัสดังนี้ในequalsวิธี if (getClass() != other.getClass()) { return false; } นี้ทำให้เกิดปัญหาเมื่อคุณผสมการใช้งานในPerson HashMapหากมีHashMapเพียงคนเดียวที่ใส่ใจเกี่ยวกับมุมมองระดับอินเตอร์เฟสของPersonมันก็อาจจบลงด้วยการซ้ำที่แตกต่างกันเฉพาะในชั้นเรียนของพวกเขาใช้งาน คุณสามารถทำให้กรณีนี้ทำงานโดยใช้วิธีการแบบเดียวกันequals()สำหรับการใช้งานทั้งหมด แต่คุณเสี่ยงต่อการequals()ทำสิ่งที่ผิดในบริบทที่แตกต่างกัน (เช่นการเปรียบเทียบสองPersons ที่สำรองข้อมูลโดยบันทึกฐานข้อมูลที่มีหมายเลขรุ่น) สัญชาตญาณของฉันบอกฉันว่าควรกำหนดความเสมอภาคต่อการรวบรวมแทนที่จะเป็นแบบต่อชั้นเรียน เมื่อใช้คอลเลกชันที่พึ่งพาการสั่งซื้อคุณสามารถใช้แบบกำหนดเองComparatorเพื่อเลือกลำดับที่ถูกต้องในแต่ละบริบท ไม่มีอะนาล็อกสำหรับคอลเล็กชันที่ใช้แฮช ทำไมนี้ คำถามนี้แตกต่างจาก " Why is .compareTo () ในส่วนติดต่อในขณะที่. equals () อยู่ในคลาสใน Java? " เพราะเกี่ยวข้องกับการใช้งานคอลเลกชัน compareTo()และequals()/ hashcode()ทั้งสองประสบปัญหาสากลเมื่อใช้คอลเลกชัน: คุณไม่สามารถเลือกฟังก์ชั่นการเปรียบเทียบที่แตกต่างกันสำหรับคอลเลกชันที่แตกต่างกัน ดังนั้นสำหรับวัตถุประสงค์ของคำถามนี้ลำดับชั้นการสืบทอดของวัตถุไม่สำคัญเลย สิ่งที่สำคัญคือฟังก์ชันการเปรียบเทียบถูกกำหนดต่อวัตถุหรือต่อการรวบรวม
25 java  collections 

1
เหตุใดอาร์เรย์ใน. Net จึงมีความยาว แต่คอลเลกชันประเภทอื่นมีจำนวนถึง [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ใน C # ตัวอย่างอาร์เรย์มีคุณสมบัติความยาว แต่คอลเล็กชันประเภทอื่น ๆ เช่นรายการ ฯลฯ มีคุณสมบัติ Count มีเหตุผลทำไมทั้งสองนี้แตกต่างกันอย่างไร ถ้าฉันอยากรู้


4
ตกลงเปลี่ยนบางส่วนของคอลเลกชันด้วย PUT หรือ DELETE หรือไม่?
ฉันมีชุดผลิตภัณฑ์ในกลุ่มผลิตภัณฑ์เช่น: product-groups/123/products ถ้าฉันต้องการเพิ่มลงในคอลเลกชันฉันจะส่งผลิตภัณฑ์บางอย่างที่มี PUT ได้หรือไม่ หากฉันต้องการลบผลิตภัณฑ์บางอย่างออกจากคอลเลกชันฉันจะส่งข้อมูลตัวกรอง (อาร์เรย์ของ ID) ด้วย DELETE ได้หรือไม่ เป็นวิธีที่ดีที่สุดในการใช้งานฟังก์ชันในจิตวิญญาณของ ReST อะไร แก้ไข: รายการเหล่านี้เป็นลิงค์ไปยังเอนทิตีที่แยกจากกันโดยทั่วไปเป็น ID ของผลิตภัณฑ์
21 rest  collections 

5
วิธีที่มีประสิทธิภาพในการสลับวัตถุ
ฉันกำลังเขียนโปรแกรมสำหรับซอฟต์แวร์ตอบคำถาม ฉันมีชั้นคำถามที่มี ArrayLists สำหรับคำถามคำตอบตัวเลือกเครื่องหมายและเครื่องหมายลบ บางสิ่งเช่นนี้ class question { private ArrayList<Integer> index_list; private ArrayList<String> question_list; private ArrayList<String> answer_list; private ArrayList<String> opt1_list; private ArrayList<String> opt2_list; } ฉันต้องการสลับคำถามทั้งหมด แต่สำหรับคำถามที่จะสับได้วัตถุทั้งหมดต้องถูกสับ ฉันจะเข้าหาปัญหานี้ด้วยวิธีนี้: ก่อนอื่นฉันจะไม่ใช้การออกแบบนี้และใช้ String ที่ไม่ArrayList<String>พิมพ์เป็นตัวแปรอินสแตนซ์และจากนั้นจะใช้Collections.shuffleวิธีการสลับวัตถุ แต่ทีมของฉันยืนยันในการออกแบบนี้ ตอนนี้คลาสคำถามจะมี ArrayLists ที่เพิ่มขึ้นเมื่อมีการป้อนคำถาม จะสลับคำถามได้อย่างไร
20 java  collections 

3
มันเป็นสิ่งที่มีเหตุผลหรือไม่ที่จะส่งคืนสตรีมทุกครั้งที่เราจะคืนคอลเล็คชั่น?
ในขณะที่การพัฒนา API ของฉันที่ไม่ได้เชื่อมโยงกับรหัสดั้งเดิมใด ๆ ฉันมักจะพบว่าตัวเองเขียนวิธีการที่ Streams หมดจดไปป์ไลน์โดยการรวบรวมผลลัพธ์ ชอบสิ่งนี้: ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfThing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey) .collect(MyCustomCollectors.toImmutableSet()); } ตอนนี้ลูกค้าส่วนใหญ่ของคลาสนี้มักจะต้องการคอลเล็กชัน (ในกรณีนี้คือ ImmutableSet) เพื่อค้นหาองค์ประกอบและวนซ้ำ แต่ลูกค้าบางรายอาจได้รับประโยชน์จากการมีสตรีมดังนั้นพวกเขาจึงสามารถดำเนินการเพิ่มเติมได้ สตรีมโดยไม่จำเป็นต้องรับสตรีมใหม่จากคอลเล็กชัน ดังนั้นการส่งคืนสตรีมจะให้ตัวเลือกที่เหนือกว่าที่พวกเขามีหากพวกเขาเพิ่งมีการสะสม (หลังจากทั้งหมดพวกเขาสามารถcollect()สตรีมได้เสมอ: Stream<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfthing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey); // No collect } วิธีการนี้ดึงดูดให้ฉันลองเพราะฉันไม่เห็นข้อบกพร่องใด ๆ ที่อาจเกิดขึ้น อย่างไรก็ตามฉันไม่เคยเห็นวิธีการนี้ในห้องสมุดใด ๆ (อาจเพราะไม่มีห้องสมุดจำนวนมากที่เผยแพร่หลังจากการปรากฏตัวของ Java 8) ดังนั้นฉันกลัวที่จะยอมรับมัน คลาสไลบรารีที่มีอยู่มักจะส่งคืนคอลเล็กชันเมื่อได้รับบางสิ่งจากสถานะส่วนตัว มีบางสิ่งที่ไม่ดีที่อาจเกิดขึ้นได้หรือไม่หากฉันตัดสินใจคืนสตรีมในที่ใดก็ตามที่ตัวเอง pre-Java-8 …

3
วิธีทดสอบหน่วยวิธีการที่ส่งคืนคอลเลกชันในขณะที่หลีกเลี่ยงตรรกะในการทดสอบ
ฉันกำลังทดสอบวิธีการในการสร้างคอลเลกชันของวัตถุข้อมูล ฉันต้องการตรวจสอบว่ามีการตั้งค่าคุณสมบัติของวัตถุอย่างถูกต้อง คุณสมบัติบางอย่างจะถูกตั้งค่าเป็นสิ่งเดียวกัน อื่น ๆ จะถูกกำหนดเป็นค่าซึ่งขึ้นอยู่กับตำแหน่งของพวกเขาในคอลเลกชัน วิธีที่เป็นธรรมชาติในการทำสิ่งนี้ดูเหมือนจะเป็นแบบวนซ้ำ อย่างไรก็ตาม Roy Osherove แนะนำอย่างยิ่งต่อการใช้ตรรกะในการทดสอบหน่วย ( Art of Unit Testing , 178) เขาพูดว่า: การทดสอบที่มีลอจิกมักจะทำการทดสอบมากกว่าหนึ่งอย่างในแต่ละครั้งซึ่งไม่แนะนำให้ทำเพราะการทดสอบนั้นสามารถอ่านได้ง่ายกว่าและเปราะบางกว่า แต่ตรรกะการทดสอบยังเพิ่มความซับซ้อนที่อาจมีจุดบกพร่องที่ซ่อนอยู่ การทดสอบควรเป็นชุดของการเรียกใช้เมธอดโดยไม่มีโฟลว์ควบคุมไม่เท่าtry-catchกันและด้วยการเรียกยืนยัน อย่างไรก็ตามฉันไม่เห็นสิ่งผิดปกติในการออกแบบของฉัน (คุณจะสร้างรายการของวัตถุข้อมูลได้อย่างไรค่าบางค่าขึ้นอยู่กับว่าอยู่ในลำดับที่เป็นอย่างไร - ไม่สามารถสร้างและทดสอบแยกต่างหากได้อย่างแน่นอน มีบางสิ่งที่ไม่เป็นมิตรกับการออกแบบของฉันหรือไม่? หรือการอุทิศตนอย่างจริงจังกับคำสอนของ Osherove เกินไป? หรือมีเวทย์มนตร์ทดสอบหน่วยความลับบางอย่างที่ฉันไม่รู้เกี่ยวกับการหลีกเลี่ยงปัญหานี้หรือไม่? (ฉันกำลังเขียนใน C # / VS2010 / NUnit แต่มองหาคำตอบที่ไม่เชื่อเรื่องภาษาถ้าเป็นไปได้)

5
Java Heap Allocation เร็วกว่า C ++
ฉันโพสต์คำถามนี้ไว้ใน SO แล้วและก็ใช้ได้ มันน่าเสียดายที่ปิด แต่ (ต้องการเพียงหนึ่งโหวตเพื่อเปิดใหม่) แต่มีคนแนะนำให้ฉันโพสต์ไว้ที่นี่เพราะมันเป็นแบบที่ดีกว่าดังนั้นต่อไปนี้เป็นสำเนาวางคำถามอย่างแท้จริง ฉันอ่านความคิดเห็นเกี่ยวกับคำตอบนี้และฉันเห็นข้อความนี้ การสร้างอินสแตนซ์ของวัตถุและคุณสมบัติเชิงวัตถุนั้นรวดเร็วในการใช้งาน (เร็วกว่า C ++ ในหลาย ๆ กรณี) เพราะพวกมันถูกออกแบบมาตั้งแต่ต้น และคอลเลกชันนั้นรวดเร็ว Java มาตรฐานชนะ C / C ++ มาตรฐานในพื้นที่นี้แม้สำหรับรหัส C ที่ปรับให้เหมาะสมที่สุด ผู้ใช้หนึ่งราย (ที่มีตัวแทนที่สูงมากฉันอาจเพิ่ม) ปกป้องข้อเรียกร้องนี้อย่างกล้าหาญโดยระบุว่า การจัดสรรฮีปใน java ดีกว่าของ C ++ และเพิ่มคำสั่งนี้เพื่อป้องกันการรวบรวมใน java และคอลเลกชัน Java นั้นเร็วกว่าคอลเลกชัน C ++ ซึ่งส่วนใหญ่จะเป็นระบบย่อยหน่วยความจำที่แตกต่างกัน ดังนั้นคำถามของฉันอาจเป็นจริงได้และถ้าเป็นเช่นนั้นเหตุใดการจัดสรรฮีปของ Java จึงเร็วขึ้นมาก

2
โครงสร้างบรรจุภัณฑ์ของคอลเลกชัน Java (java.util) - ทำไม Iterable sit ใน java.lang
ตามแผนภาพด้านล่างยกเว้นส่วนต่อประสานส่วนIterableที่เหลือทั้งหมดที่สร้างขึ้น (คลาสอินเตอร์เฟส / คลาส / นามธรรม) จะอยู่ในแพ็คเกจเดียวกันjava.util ทำไมต้องIterableนั่งในjava.langแพ็คเกจ? หมายเหตุ: ความตั้งใจคือการทำความเข้าใจกับแง่มุมของบรรจุภัณฑ์ของการเขียนโปรแกรมจาวา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.