Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีหาค่าที่ซ้ำกันในอาร์เรย์ (Common Elements) แสดงใน Android ListView

ภาพรวม

ตัวอย่างนี้สาธิตวิธีหา 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 ComplexitySpace Complexityเหมาะสำหรับ
HashSet.retainAll()O(n + m)O(n + m)ข้อมูลทั่วไป แนะนำใช้
Nested LoopO(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"]