JavaRush /Blog Java /Random-VI /Nghỉ giải lao #116. Cách sử dụng con trỏ hàm trong Java. ...

Nghỉ giải lao #116. Cách sử dụng con trỏ hàm trong Java. indexOf trong Java - Cách tìm chỉ mục của chuỗi trong Java

Xuất bản trong nhóm

Cách sử dụng con trỏ hàm trong Java

Nguồn: Con trỏ Dev.to là các đối tượng lưu trữ địa chỉ bộ nhớ và có thể tiết kiệm bộ nhớ bằng cách trỏ trực tiếp đến đối tượng đích, mảng hoặc địa chỉ biến thay vì truyền theo giá trị. Thật không may, không có khái niệm “thực sự” về con trỏ trong Java. Nhưng thật may mắn cho chúng ta, có một cách giải quyết bằng cách sử dụng các tham chiếu phương thức gần với thực tế. Nghỉ giải lao #116.  Cách sử dụng con trỏ hàm trong Java.  indexOf trong Java - Cách tìm chỉ mục của chuỗi trong Java - 1

Con trỏ hàm

Con trỏ hàm là con trỏ trỏ tới địa chỉ của hàm. Một số trường hợp sử dụng bao gồm việc tạo quy trình gọi lại bằng cách tạo một hàm gọi hàm khác dựa trên việc thực thi của nó hoặc lưu trữ một mảng con trỏ hàm cho các phương thức được gọi động (ví dụ: lưu trữ hướng dẫn bộ xử lý cho trình mô phỏng).

Mô phỏng con trỏ hàm

Có bốn loại tài liệu tham khảo phương pháp . Chúng tôi sử dụng một loại đề cập đến một phương thức thể hiện của một đối tượng cụ thể. Hãy bắt đầu bằng cách xác định một giao diện xác định chữ ký của các phương thức bạn trỏ tới.
// Wrapping interface
private interface FunctionPointer {
  // Method signatures of pointed method
  void methodSignature(int a);
}
Sau đó chúng ta sẽ tạo các phương thức có chữ ký của phương thức đích.
public void method1(int b) {
  System.out.println("Called method1 with integer " + b);
}

public void method2(int v) {
  System.out.println("Called method2 with integer " + v);
}

public void method3(int a) {
  System.out.println("Called method3 with integer " + a);
}
Bước tiếp theo là tạo các biến giao diện trình bao bọc và gán phương thức cho chúng. Các biến sẽ hoạt động như một con trỏ tới hàm sẽ được lưu trữ hoặc thực thi.
// Create a variable of the interface and assign
// the method references
FunctionPointer pointer1 = this::method1;
FunctionPointer pointer2 = this::method2;

// Call both methods using their "pointer"
pointer1.methodSignature(3);
pointer2.methodSignature(2);

// Reassign and call pointer 1
pointer1 = this::method3;

pointer1.methodSignature(5);
Đã gọi phương thức 1 với số nguyên 3 Được gọi là phương thức 2 với số nguyên 2 Được gọi là phương thức 3 với số nguyên 5

Sử dụng biểu thức Lambda

Tham chiếu phương thức có thể được chỉ định bằng biểu thức lambda.
// Create a method reference and assign a methods using a lambda.
FunctionPointer pointer1 =
  (a) -> System.out.println("Called pointer1 with int " + a);

FunctionPointer pointer2 =
  (b) -> System.out.println("Called pointer2 with int " + b);

Mảng con trỏ hàm

Chức năng của một mảng tham chiếu phương thức có thể được mô phỏng bằng cách tạo một mảng giao diện trình bao bọc.
// Create an array of "pointers"
FunctionPointer[] functionPointersArray = new FunctionPointer[3];

// Assign methods
functionPointersArray[0] = this::method1;
functionPointersArray[1] = this::method2;
functionPointersArray[2] = this::method3;

// Call methods
functionPointersArray[0].methodSignature(3);
functionPointersArray[1].methodSignature(4);
functionPointersArray[2].methodSignature(5);

Con trỏ hàm và cuộc gọi trực tiếp

Nếu bạn so sánh cả hai tùy chọn, việc gọi trực tiếp một phương thức sẽ nhanh hơn gần 5 lần so với sử dụng tham chiếu phương thức. Tất cả là do có thêm một bước gọi biểu thức lambda so với phương thức được lưu trữ. Nhưng bạn có thể sẽ không nhận thấy bất kỳ sự suy giảm hiệu suất nào trong một năm, vì vậy đừng lo lắng về điều đó.

Phần kết luận

Con trỏ là các biến trỏ trực tiếp đến địa chỉ của một đối tượng chứ không phải một giá trị. Con trỏ hàm trỏ trực tiếp đến địa chỉ hàm, điều này có thể làm giảm mức tiêu thụ bộ nhớ. Java không có con trỏ nhưng có thể mô phỏng hành vi bằng cách sử dụng tham chiếu phương thức hoặc biểu thức lambda. Sử dụng tham chiếu phương thức sẽ chậm hơn so với gọi trực tiếp một phương thức, nhưng điều này không ngăn cản việc sử dụng phương thức đó.

indexOf trong Java - Cách tìm chỉ mục của chuỗi trong Java

Nguồn: FreeCodeCamp Chuỗi là tập hợp các ký tự được đặt trong dấu ngoặc kép. Phương thức indexOf trả về vị trí chỉ mục của ký tự hoặc chuỗi con được chỉ định trong một chuỗi. Trong bài viết này, chúng ta sẽ tìm hiểu về cú pháp của các phương thức indexOf khác nhau . Chúng ta cũng sẽ xem xét các ví dụ giúp bạn hiểu và sử dụng hiệu quả việc tìm kiếm chỉ mục của một ký tự hoặc chuỗi con trong mã Java. Nghỉ giải lao #116.  Cách sử dụng con trỏ hàm trong Java.  indexOf trong Java - Cách tìm chỉ mục của một chuỗi trong Java - 2

Cú pháp của phương thức indexOf

Phương thức indexOf có các phương thức sau:
public int indexOf(int char)
public int indexOf(int char, int fromIndex)
public int indexOf(String str)
public int indexOf(String str, int fromIndex)
Hãy giải thích các thông số này:
  • char đại diện cho một ký tự trên mỗi dòng.
  • fromIndex chỉ định vị trí bắt đầu tìm kiếm chỉ mục của một ký tự hoặc chuỗi con. Điều này rất quan trọng khi bạn có hai ký tự/chuỗi có cùng giá trị trong một chuỗi. Với tham số này, bạn có thể cho phương thức indexOf biết bắt đầu từ đâu.
  • str đại diện cho một chuỗi con trong một chuỗi.
Đừng lo lắng nếu bạn vẫn chưa hiểu cách thức hoạt động của nó—các ví dụ sẽ làm rõ mọi thứ!

Cách sử dụng phương thức indexOf trong Java

Trong ví dụ đầu tiên, chúng ta sẽ tìm chỉ mục của một ký tự trong chuỗi. Điều này sẽ giúp chúng ta hiểu phương thức public int indexOf(int char) .

Ví dụ về phương thức IndexOf(int Char)

public class Main {
  public static void main(String[] args) {
    String greetings = "Hello World";

    System.out.println(greetings.indexOf("o"));

    // 4
  }
}
Trong đoạn mã trên, chúng ta nhận được chỉ mục của ký tự “o” được trả về là 4. Chúng ta có hai ký tự “o”, nhưng chỉ trả về chỉ mục của ký tự đầu tiên. Trong ví dụ sau, chúng ta sẽ xem cách trả về chỉ mục của chữ "o" thứ hai. Nếu bạn đang thắc mắc làm thế nào để lấy được số thứ tự, bạn sẽ nhận thấy rằng ký tự đầu tiên trong chuỗi có chỉ số bằng 0, ký tự thứ hai có chỉ mục là 1, v.v.

Ví dụ về phương thức indexOf(int Char, Int fromIndex)

Dưới đây là một ví dụ giải thích phương thức int indexOf(int char, int fromIndex) :
public class Main {
  public static void main(String[] args) {
    String greetings = "Hello World";

    System.out.println(greetings.indexOf("o", 5));

    // 7
  }
}
Trong ví dụ trên, chúng tôi yêu cầu phương thức indexOf bắt đầu hoạt động ở chỉ mục thứ năm. H => chỉ số 0 e => chỉ số 1 l => chỉ số 2 l => chỉ số 3 0 => chỉ mục 4 Lưu ý rằng chỉ số 5 không phải là ký tự “W”. Chỉ số thứ năm là khoảng cách giữa “Xin chào” và “Thế giới”. Do đó, trong mã này, tất cả các ký tự khác trước chỉ mục thứ năm sẽ bị bỏ qua. 7 được trả về làm chỉ mục của ký tự thứ hai “o”.

Ví dụ về phương thức Int indexOf(String Str)

Trong ví dụ sau, chúng ta sẽ hiểu cách thức hoạt động của phương thức public int indexOf(String str) , phương thức này trả về chỉ mục của một chuỗi con.
public class Main {
  public static void main(String[] args) {
    String motivation = "Coding can be difficult but don't give up";

    System.out.println(motivation.indexOf("be"));

    // 11
  }
}
Tôi tự hỏi làm thế nào chúng tôi lấy lại được 11? Bạn nên xem lại phần cuối cùng để hiểu cách tính chỉ mục và khoảng cách giữa các chuỗi con cũng được coi là chỉ mục như thế nào. Lưu ý rằng khi một chuỗi con được truyền dưới dạng tham số, chỉ mục được trả về là chỉ mục của ký tự đầu tiên trong chuỗi con. 11 là chỉ số của ký tự “b”.

Ví dụ về phương thức indexOf(String Str, Int fromIndex)

Phương thức cuối cùng là public int indexOf(String str, int fromIndex) - giống như phương thức public int indexOf(int char, int fromIndex) . Nó trả về chỉ mục từ vị trí đã chỉ định.
public class Main {
  public static void main(String[] args) {
    String motivation = "The for loop is used for the following";

    System.out.println(motivation.indexOf("for", 5));

    // 21
  }
}
Trong ví dụ này, chúng tôi đã chỉ định rằng phương thức sẽ bắt đầu hoạt động ở chỉ mục thứ năm, sau chuỗi con đầu tiên for. 21 là chỉ mục của chuỗi con thứ hai của for. Cuối cùng, khi chúng ta truyền một ký tự hoặc chuỗi con không có trong chuỗi, phương thức indexOf sẽ trả về -1. Đây là một ví dụ:
public class Main {
  public static void main(String[] args) {
    String motivation = "The for loop is used for the following";

    System.out.println(motivation.indexOf("code"));

    // -1
  }
}

Phần kết luận

Trong bài viết này, chúng ta đã tìm hiểu cách sử dụng bốn phương thức indexOf với các ví dụ rõ ràng. Chúng ta cũng đã thấy cú pháp của từng phương thức này trông như thế nào và cách chúng yêu cầu chỉ mục trả về. Ngoài ra, chúng tôi có thể tìm hiểu điều gì sẽ xảy ra khi một ký tự hoặc chuỗi con không tồn tại được truyền dưới dạng tham số.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION