ภาพรวม
ตัวอย่างนี้สาธิตวิธีหา Common Elements (ค่าที่ซ้ำกัน) จากสองอาร์เรย์ และแสดงผลใน ListView ใน Android
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
เปิด Android Studio ไปที่ File → New Project กรอกรายละเอียดที่จำเป็นทั้งหมดเพื่อสร้างโปรเจกต์ใหม่
ขั้นตอนที่ 2: จัดทำ Layout (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
android:layout_marginTop="30dp"
tools:context=".MainActivity">
<ListView
android:id="@+id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
ขั้นตอนที่ 3: เขียนโค้ดหลัก (src/MainActivity.java)
package com.example.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class MainActivity extends AppCompatActivity {
ListView list;
String[] names = new String[]{"A", "B", "C"};
String[] extended = new String[5];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = findViewById(R.id.list);
extended[3] = "D";
extended[4] = "E";
System.arraycopy(names, 0, extended, 0, names.length);
// extended = ["A", "B", "C", "D", "E"]
// วิธีที่ 1: ใช้ HashSet (แนะนำ - O(n))
Set<String> set1 = new HashSet<>(Arrays.asList(names));
Set<String> set2 = new HashSet<>(Arrays.asList(extended));
set1.retainAll(set2); // เก็บเฉพาะค่าที่อยู่ในทั้งสองเซต
ArrayList<String> common = new ArrayList<>(set1);
// common = ["A", "B", "C"]
// วิธีที่ 2: Nested Loop (โค้ดต้นฉบับ - O(n²))
// ArrayList<String> common = new ArrayList<>();
// for (int i = 0; i < names.length; i++) {
// for (int j = 0; j < extended.length; j++) {
// if (names[i].equals(extended[j])) {
// common.add(names[i]);
// }
// }
// }
ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, common);
list.setAdapter(adapter);
}
}
การทดสอบ
รันแอป จะแสดง ListView มีรายการ A, B, C (ค่าที่ซ้ำกันในทั้งสองอาร์เรย์)
เปรียบเทียบวิธีการหา Common Elements
| วิธี | Time Complexity | Space Complexity | เหมาะสำหรับ |
|---|---|---|---|
| HashSet.retainAll() | O(n + m) | O(n + m) | ข้อมูลทั่วไป แนะนำใช้ |
| Nested Loop | O(n × m) | O(min(n,m)) | อาร์เรย์เล็กมาก / ไม่ต้องการ import |
| Stream API (Java 8+) | O(n + m) | O(n + m) | โค้ดสั้น อ่านง่าย |
| Arrays.binarySearch (ต้อง Sort ก่อน) | O(n log n + m log m) | O(1) | อาร์เรย์ใหญ่ ที่ Sort แล้ว |
วิธีเพิ่มเติม: Java 8 Stream API
// ต้องเพิ่ม minSdkVersion 24+ ใน build.gradle
List<String> common = Arrays.stream(names)
.filter(s -> Arrays.asList(extended).contains(s))
.collect(Collectors.toList());
การใช้งานจริง
- หาเพื่อนร่วมสนใจระหว่างสองผู้ใช้
- เปรียบเทียบรายการสินค้าในตะกร้ากับ Wishlist
- Sync ข้อมูลระหว่าง Server และ Local
- Filter ข้อมูลซ้ำก่อน Insert Database
ขยายความ: หาค่าที่ไม่ซ้ำ (Symmetric Difference)
// ค่าที่อยู่ในอาร์เรย์ใดอาร์เรย์หนึ่ง แต่ไม่ใช่ทั้งสอง Set<String> symmetricDiff = new HashSet<>(set1); symmetricDiff.addAll(set2); Set<String> intersection = new HashSet<>(set1); intersection.retainAll(set2); symmetricDiff.removeAll(intersection); // ผลลัพธ์: ["D", "E"]