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

วิธีเพิ่มข้อมูลจาก ArrayDeque ไป ArrayList สำหรับ ListView บน Android

การโอนข้อมูลจาก ArrayDeque ไป ArrayList เพื่อแสดงใน ListView

ตัวอย่างนี้สาธิตการใช้ ArrayDeque (Double-ended Queue) เป็นโครงสร้างข้อมูลชั่วคราว แล้วนำข้อมูลไปใส่ใน ArrayList เพื่อแสดงใน ListView

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

สร้างโปรเจกต์ Android ใหม่ใน Android Studio

ขั้นตอนที่ 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"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/etName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="ป้อนชื่อ" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:orientation="horizontal">
        <Button android:id="@+id/btnSave" android:text="บันทึก" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <Button android:id="@+id/btnRefresh" android:text="รีเฟรช" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    </LinearLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp">
    </ListView>
</LinearLayout>

ขั้นตอนที่ 3: MainActivity.java

package com.example.myapplication;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;

public class MainActivity extends AppCompatActivity {
    private EditText etName;
    private ListView listView;
    private ArrayAdapter<String> adapter;
    private ArrayList<String> arrayList = new ArrayList<>();
    private Deque<String> deque = new ArrayDeque<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etName = findViewById(R.id.etName);
        listView = findViewById(R.id.listView);

        findViewById(R.id.btnRefresh).setOnClickListener(v -> {
            if (adapter != null) {
                adapter.notifyDataSetChanged();
                listView.invalidateViews();
                listView.refreshDrawableState();
            }
        });

        findViewById(R.id.btnSave).setOnClickListener(v -> {
            String input = etName.getText().toString().trim();
            if (!input.isEmpty()) {
                // 1. เพิ่มข้อมูลลง ArrayList (หลัก)
                arrayList.add(input);

                // 2. โอนข้อมูลทั้งหมดไป ArrayDeque (สาธิตการใช้ Deque)
                deque.clear();
                deque.addAll(arrayList);

                // 3. ล้าง ArrayList และโอนกลับจาก Deque
                arrayList.clear();
                arrayList.addAll(deque);

                // 4. อัปเดต ListView
                adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
                listView.setAdapter(adapter);

                Toast.makeText(this, "บันทึกสำเร็จ (via Deque)", Toast.LENGTH_SHORT).show();
            } else {
                etName.setError("กรุณาป้อนชื่อ");
            }
        });
    }
}

คำอธิบาย ArrayDeque

  • ArrayDeque : Resizable-array implementation ของ Deque interface (Double-ended Queue)
  • รองรับการเพิ่ม/ลบ ทั้งหัวและท้ายได้ใน O(1) - เร็วกว่า LinkedList และ ArrayList สำหรับการทำงานที่หัว/ท้าย
  • ไม่มี capacity limit (ขยายอัตโนมัติ)
  • ไม่รองรับ null elements
  • ไม่ thread-safe (ใช้ ConcurrentLinkedDeque สำหรับ multi-thread)

เมธอดหลักของ Deque (Double-ended Queue)

OperationFirst (Head)Last (Tail)
InsertaddFirst(e), push(e)addLast(e), add(e), offer(e)
RemoveremoveFirst(), pop()removeLast(), poll()
ExaminegetFirst(), peekFirst(), peek()getLast(), peekLast()

ตัวอย่างการใช้งาน Deque จริง

1. ใช้เป็น Stack (LIFO)

Deque<String> stack = new ArrayDeque<>();
stack.push("A"); // เพิ่มหน้า
stack.push("B");
stack.push("C");
String top = stack.pop(); // ได้ "C" - ล่าสุดที่เพิ่ม

2. ใช้เป็น Queue (FIFO)

Deque<String> queue = new ArrayDeque<>();
queue.addLast("A"); // เพิ่มท้าย
queue.addLast("B");
queue.addLast("C");
String front = queue.removeFirst(); // ได้ "A" - เก่าสุด

3. ใช้เป็น Deque (ทั้งสองด้าน)

Deque<String> deque = new ArrayDeque<>();
deque.addFirst("A"); // [A]
deque.addLast("B");  // [A, B]
deque.addFirst("C"); // [C, A, B]
deque.removeLast();  // [C, A] - ลบท้าย

ArrayDeque vs ArrayList vs LinkedList

OperationArrayDequeArrayListLinkedList
Add/Remove FirstO(1) ✓O(n) ✗O(1) ✓
Add/Remove LastO(1) ✓O(1) amortized ✓O(1) ✓
Random AccessO(n) ✗O(1) ✓O(n) ✗
Memory OverheadLowLowHigh (Node objects)
Cache FriendlyYes (Array)Yes (Array)No (Pointers)

กรณีที่ควรใช้ ArrayDeque

  • Implement Stack/Queue (แทน Stack/Queue class เก่า)
  • Sliding window algorithms
  • Breadth-First Search (BFS) - Queue
  • Undo/Redo functionality - Stack
  • Palindrome checker - Deque
  • Buffer/Cache ที่ต้องเพิ่มลบทั้งสองข้าง

ในตัวอย่างนี้

แม้โค้ดตัวอย่างจะโอนข้อมูล ArrayList → Deque → ArrayList (ซ้ำซ้อน) แต่จุดประสงค์คือสาธิต:

  1. การสร้างและใช้งาน ArrayDeque
  2. เมธอด addAll() โอนข้อมูลระหว่าง Collection
  3. ความสามารถของ Deque ในการจัดการข้อมูล

ในทางปฏิบัติ หากแค่ต้องการแสดงใน ListView ใช้ ArrayList โดยตรงเพียงพอแล้ว Deque เหมาะกว่าเมื่อต้องการพฤติกรรม Queue/Stack