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

วิธีใช้ NavigableSet Interface ใน Android

ภาพรวม

ตัวอย่างนี้สาธิตวิธีการใช้ NavigableSet Interface (ผ่าน TreeSet) ร่วมกับ ArrayList และ ListView ใน Android พร้อมฟังก์ชัน เพิ่ม และรีเฟรช ข้อมูล NavigableSet ขยายจาก SortedSet เพิ่มเมธอดนำทาง (Navigation Methods) เช่น lower, higher, floor, ceiling

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

    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter Name" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/save"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Save" />

        <Button
            android:id="@+id/refresh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Refresh" />

    </LinearLayout>

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

</LinearLayout>

หมายเหตุ: โค้ด XML ต้นฉบับมี Syntax Error (xmlns:android ซ้ำ, layout_width ผิดที่) - ได้แก้ไขแล้วในเวอร์ชันนี้

ขั้นตอนที่ 3: เขียนโค้ดหลัก (src/MainActivity.java)

package com.example.andy.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.NavigableSet;
import java.util.TreeSet;

public class MainActivity extends AppCompatActivity {

    EditText name;
    ArrayAdapter<String> arrayAdapter;
    ArrayList<String> arrayList;
    NavigableSet<String> navigableSet = new TreeSet<>();
    private ListView listView;

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

        arrayList = new ArrayList<>();
        name = findViewById(R.id.name);
        listView = findViewById(R.id.listView);

        // ปุ่ม Refresh - อัปเดตการแสดงผล
        findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (arrayAdapter != null) {
                    arrayAdapter.notifyDataSetChanged();
                    listView.invalidateViews();
                    listView.refreshDrawableState();
                }
            }
        });

        // ปุ่ม Save - เพิ่มข้อมูล
        findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String nameText = name.getText().toString().trim();
                if (!nameText.isEmpty()) {
                    // เพิ่มใน NavigableSet (TreeSet) - จัดเรียงอัตโนมัติ
                    navigableSet.add(nameText);
                    
                    // อัปเดต ListView
                    updateListView();
                    
                    Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
                } else {
                    name.setError("Enter NAME");
                }
            }
        });
    }

    // เมธอดช่วยอัปเดต ListView
    private void updateListView() {
        arrayList.clear();
        arrayList.addAll(navigableSet);
        
        arrayAdapter = new ArrayAdapter<>(
            MainActivity.this,
            android.R.layout.simple_list_item_1,
            arrayList
        );
        listView.setAdapter(arrayAdapter);
    }
}

คำอธิบายสำคัญ:

  • NavigableSet - Interface ขยายจาก SortedSet เพิ่มเมธอดนำทาง (Navigation Methods):
    • lower(e) - ค่าที่ < น้อยที่สุด (strictly less)
    • floor(e) - ค่าที่ ≤ น้อยที่สุด (less or equal)
    • ceiling(e) - ค่าที่ ≥ มากที่สุด (greater or equal)
    • higher(e) - ค่าที่ > มากที่สุด (strictly greater)
    • pollFirst() / pollLast() - ดึงและลบค่าแรก/สุดท้าย
    • descendingSet() - มุมมองย้อนกลับ
  • TreeSet - Implementation ของ NavigableSet ใช้ Red-Black Tree จัดเรียงอัตโนมัติ O(log n)
  • ตัวอย่างนี้ใช้ฟังก์ชันพื้นฐาน (add, iteration) แต่สามารถใช้ Navigation Methods ได้
💡 ตัวอย่างการใช้ Navigation Methods:
NavigableSet<String> set = new TreeSet<>();
set.add("Mango");
set.add("Apple");
set.add("Banana");

String floor = set.floor("Coconut");  // "Banana" (≤ Coconut)
String ceiling = set.ceiling("Coconut"); // "Mango" (≥ Coconut)
String lower = set.lower("Banana");    // "Apple" (< Banana)
String higher = set.higher("Banana");  // "Mango" (> Banana)

NavigableSet<String> descending = set.descendingSet(); // [Mango, Banana, Apple]
การปรับปรุงจากโค้ดต้นฉบับ:
• แก้ไข XML Layout ให้ถูกต้อง (xmlns:android ซ้ำ, layout_width ผิด)
• เปลี่ยนชื่อตัวแปร set → navigableSet (หลีกเลี่ยง keyword)
• เพิ่ม Generic Types: NavigableSet<String>, TreeSet<>, ArrayAdapter<String>
• สร้างเมธอด updateListView() แยกต่างหาก
• ใช้ trim() และตรวจสอบ empty อย่างถูกต้อง

การทดสอบแอปพลิเคชัน

เชื่อมต่ออุปกรณ์ Android จริงกับคอมพิวเตอร์ ใน Android Studio เปิดไฟล์ Activity แล้วคลิกไอคอน Run จากแถบเครื่องมือ เลือกอุปกรณ์มือถือของคุณ

วิธีใช้ NavigableSet Interface ใน Android

วิธีใช้ NavigableSet Interface ใน Android

ภาพ: เพิ่มชื่อจาก TreeSet (NavigableSet) ไปยัง ArrayList แสดงใน ListView เรียง A-Z