วิธีที่ดีกว่าในการค้นหาดัชนีของรายการใน ArrayList?


91

สำหรับแอป Android ฉันมีฟังก์ชันดังต่อไปนี้

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

นั่นเป็นวิธีที่ "ดีที่สุด" ในการเขียนฟังก์ชันเพื่อรับตำแหน่งขององค์ประกอบหรือไม่? หรือมีฟังก์ชันเนทีฟ shmancy แฟนซีใน java ที่ฉันควรใช้?


2
รหัสนี้มีข้อบกพร่อง: การใช้==จะให้ผลลัพธ์ที่ไม่ถูกต้องในกรณีส่วนใหญ่

3
จำไว้ว่าคุณไม่สามารถเปรียบเทียบสตริงกับ '==' ได้คุณต้องใช้ String.equals (String str)
MrZander

5
@MrZander แน่ใจว่าคุณสามารถเปรียบเทียบกับ==... มันไม่ใช่การเปรียบเทียบที่ถูกต้อง ;-)

คุณสามารถบอกได้ว่าฉันยังใหม่กับ Java .. เป็นString.equalsเหมือนสิ่งที่===อาจเป็นในภาษาเช่น JavaScript? เช่น. ตรวจสอบกับค่าและประเภท?
Jacksonkr

3
ฉบับที่ ==เป็นวัตถุตัวตนและมันหมายถึง"เป็นวัตถุเดียวกัน" (มุมมองนี้ถือเป็นจริงสำหรับค่าดั้งเดิมเช่นเดียวกับประเภทการอ้างอิงหากคุณพิจารณาว่ามีเพียงตัวเลขเดียวที่มีค่า 42 หรือถ่าน 'x' เป็นต้น) Object.equalsเป็นวิธีการเสมือนที่กำหนดไว้สำหรับอินสแตนซ์อ็อบเจ็กต์ทั้งหมดและหมายความว่า"มีค่าเท่ากัน"เนื่องจากคลาสทุกประเภทขยายอ็อบเจ็กต์และควรใช้สำหรับการทดสอบความเท่าเทียมกันของอ็อบเจ็กต์ทั้งหมด มีคำถามมากมายที่หน้าปกเป็น==VS Object.equalsและนี่คือแนวคิดที่สำคัญมากที่จะเข้าใจ! ตัวอย่างเช่นนี่เป็นเท็จ: "hello" == new String("hello")! ดู๊!

คำตอบ:


195

ArrayListมีวิธีการindexOf() ตรวจสอบ API เพิ่มเติม แต่วิธีการทำงานมีดังนี้

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() จะส่งคืนสิ่งที่วิธีการของคุณกลับมาอย่างรวดเร็ว


3
มันไม่ "เร็ว" ในแง่ของความซับซ้อนไปกว่ารหัสที่โพสต์แม้ว่ามันจะถูกนำไปใช้อย่างมีประสิทธิภาพมากกว่าก็ตาม นอกจากนี้ indexOf จะตอบสนองแตกต่างกันเล็กน้อยที่นี่: รหัสต้นฉบับ [ไม่ถูกต้อง] การใช้งานในขณะที่การใช้== indexOf equals()

ในความเป็นจริงมันเกือบจะเป็นรหัสเดียวกันทุกประการ (อย่างน้อยก็ในรหัส Sun Java 6 ที่ฉันมี) ยกเว้นว่าจะเริ่มต้นด้วยสาขา if-else ที่จัดการกับ null แยกกัน
yshavit

เป็นอาร์เรย์เก่าแบบต่อสายและ List <> มีเมธอด FindIndex () แต่ API เปลี่ยนตรงกลางสำหรับ ArrayList: D
boctulus

16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

ผลลัพธ์:ดัชนีรายการ: 7

ถ้าคุณผ่านHมันจะส่งกลับ7ถ้าคุณผ่านJมันจะคืนค่า -1ตามที่เรากำหนดค่าเริ่มต้นเป็น -1

เสร็จแล้ว


ฉันจะสร้าง vise ในทางกลับกันได้อย่างไรสำหรับโซลูชันของคุณอินพุตของคุณคือH และคุณได้ตำแหน่ง Hสมมติว่าอินพุตของฉันเป็นดัชนี7ฉันจะรับค่าสตริงของดัชนีนั้นได้อย่างไร ขอบคุณ
Jimale Abdi

1
@JimaleAbdi ทำ yourArrayList.get (7) 7 คือตำแหน่งของคุณ
Hiren Patel

6

หากคุณListมีที่เรียงลำดับและมีการเข้าถึงแบบสุ่มที่ดี (ในขณะที่ArrayListไม่) Collections.binarySearchคุณควรมีลักษณะเป็น มิฉะนั้นคุณควรใช้List.indexOfตามที่คนอื่นชี้ไว้

แต่อัลกอริทึมของคุณฟังดูดี fwiw (นอกเหนือจากที่==คนอื่น ๆ ชี้ให้เห็น)


3

มีฟังก์ชันเนทีฟ shmancy แฟนซีใน java ที่คุณควรใช้

ArrayList มีวิธีการอินสแตนซ์ที่เรียกว่า

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

คุณจะสามารถเรียกมันได้_categoriesดังนี้:

_categories.indexOf("camels")

ฉันไม่มีประสบการณ์ในการเขียนโปรแกรมสำหรับ Android - แต่จะใช้ได้กับแอปพลิเคชัน Java มาตรฐาน

โชคดี.


1
ฟังก์ชันเนทีฟหมายถึง C \ C ++ สำหรับฉัน.. แค่พูด.
Hunter McMillen

3

Java API ระบุสองวิธีที่คุณสามารถใช้ได้: indexOf(Object obj)และlastIndexOf(Object obj). อันแรกส่งคืนดัชนีขององค์ประกอบหากพบ -1 มิฉะนั้น อันที่สองส่งคืนดัชนีสุดท้ายซึ่งเหมือนกับการค้นหารายการย้อนหลัง


1

วิธีที่ดีที่สุดในการค้นหาตำแหน่งของรายการในรายการคือการใช้อินเทอร์เฟซ Collections

เช่น,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

เอาต์พุต: 2



0

ทางออกที่ดีที่สุดที่นี่

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map { x->x.Id }.indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.