Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng removeLast() trong LinkedBlockingDeque trên Android

Giới thiệu về removeLast()

removeLast() lấy và xóa phần tử cuối cùng (tail) của deque. Ném NoSuchElementException nếu deque rỗng.

LinkedBlockingDeque hỗ trợ thao tác cả hai đầu: đầu (head) và cuối (tail), thread-safe, optional bounded.

Ví dụ minh họa

Bước 1: Tạo project

Android Studio → File → New Project.

Bước 2: Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <TextView
        android:id="@+id/actionEvent"
        android:textSize="40sp"
        android:layout_marginTop="30dp"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />
</LinearLayout>

Bước 3: Code (src/MainActivity.java)

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import java.util.concurrent.LinkedBlockingDeque;

public class MainActivity extends AppCompatActivity {
    LinkedBlockingDeque<String> linkedBlockingDeque;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        linkedBlockingDeque = new LinkedBlockingDeque<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);

        linkedBlockingDeque.add("sai");
        linkedBlockingDeque.add("ram");
        linkedBlockingDeque.add("krishna");
        linkedBlockingDeque.add("prasad");
        linkedBlockingDeque.add("ram");

        actionEvent.setText("" + linkedBlockingDeque);

        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // removeLast() lấy VÀ xóa phần tử CUỐI
                linkedBlockingDeque.removeLast();
                actionEvent.setText("" + linkedBlockingDeque);
            }
        });
    }
}

Kết quả

Ban đầu: [sai, ram, krishna, prasad, ram]

Click 1: [sai, ram, krishna, prasad] (xóa "ram" cuối)

Click 2: [sai, ram, krishna] (xóa "prasad")

Click 3: [sai, ram] (xóa "krishna")

Click 4: [sai] (xóa "ram")

Click 5: [] (xóa "sai")

Click 6: Crash - NoSuchElementException

Xử lý an toàn

// Cách 1: Kiểm tra isEmpty()
if (!linkedBlockingDeque.isEmpty()) {
    linkedBlockingDeque.removeLast();
}

// Cách 2: Dùng pollLast() - trả về null
String last = linkedBlockingDeque.pollLast();
if (last != null) {
    // Đã xóa thành công
}

// Cách 3: Try-catch
try {
    linkedBlockingDeque.removeLast();
} catch (NoSuchElementException e) {
    // Xử lý rỗng
}

So sánh các phương thức xóa cuối

Phương thức Rỗng Trả về Blocking (bounded)
removeLast() Ném Exception E Không
pollLast() Trả về null E hoặc null Không
takeLast() Block vô hạn E Có

Ứng dụng - Deque làm Stack (LIFO)

LinkedBlockingDeque<String> stack = new LinkedBlockingDeque<>();

// Push - thêm vào cuối
stack.addLast("Item 1");
stack.addLast("Item 2");
stack.addLast("Item 3");

// Pop - lấy từ cuối (LIFO)
String top = stack.removeLast(); // "Item 3"
String next = stack.removeLast(); // "Item 2"

// Hoặc dùng pollLast() an toàn
String safe = stack.pollLast();

Ứng dụng - Deque làm Queue (FIFO)

LinkedBlockingDeque<Task> queue = new LinkedBlockingDeque<>();

// Enqueue - thêm vào cuối
queue.addLast(new Task("A"));
queue.addLast(new Task("B"));

// Dequeue - lấy từ đầu
Task task = queue.removeFirst(); // "A" - FIFO

Lưu ý

  • Luôn kiểm tra isEmpty() trước khi removeLast()
  • Thread-safe cho đa luồng
  • Có bounded constructor: new LinkedBlockingDeque<>(capacity)
  • Kết hợp addFirst()/removeLast() cho Stack, addLast()/removeFirst() cho Queue