Vì vậy, tôi muốn lặp lại cho mỗi ký tự trong một chuỗi.
Vì vậy, tôi nghĩ:
for (char c : "xyz")
nhưng tôi gặp lỗi trình biên dịch:
MyClass.java:20: foreach not applicable to expression type
Tôi có thể làm cái này như thế nào?
Vì vậy, tôi muốn lặp lại cho mỗi ký tự trong một chuỗi.
Vì vậy, tôi nghĩ:
for (char c : "xyz")
nhưng tôi gặp lỗi trình biên dịch:
MyClass.java:20: foreach not applicable to expression type
Tôi có thể làm cái này như thế nào?
Câu trả lời:
Cách dễ nhất để sử dụng cho mỗi thứ char
trong một String
là sử dụng toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
Điều này mang lại cho bạn sự đồng nhất của từng cấu trúc, nhưng thật không may String
(không thể thay đổi) phải thực hiện một bản sao phòng thủ để tạo ra char[]
(có thể thay đổi), do đó có một số hình phạt chi phí.
Từ tài liệu :
[
toCharArray()
trả về] một mảng ký tự mới được phân bổ có độ dài là độ dài của chuỗi này và có nội dung được khởi tạo để chứa chuỗi ký tự được đại diện bởi chuỗi này.
Có nhiều cách lặp lại dài dòng hơn các ký tự trong một mảng (thường xuyên cho vòng lặp CharacterIterator
, v.v.) nhưng nếu bạn sẵn sàng trả chi phí toCharArray()
cho - thì mỗi cách là ngắn gọn nhất.
toCharArray( )
này được gọi là 3 lần?
211900000
, thời gian thực hiện để hoàn thành for (char c : str.toCharArray()) { }
là ~ 250ms và thời gian thực hiện để hoàn thành for (char c : charArray) { }
là <10ms. Tất nhiên, các giá trị thời gian này sẽ phụ thuộc vào phần cứng, nhưng điều đáng nói là một phương pháp này có chi phí đáng kể so với phương pháp khác.
toCharArray()
không nằm trong thân vòng lặp; nó chỉ được gọi một lần và sau đó vòng lặp lặp qua mảng kết quả đó. (Vòng lặp for- for
every khác với vòng lặp chung , đánh giá điều kiện dừng mỗi lần lặp.)
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Một giải pháp hữu ích khác, bạn có thể làm việc với chuỗi này dưới dạng mảng Chuỗi
for (String s : "xyz".split("")) {
System.out.println(s);
}
split()
ánh xạ tới nhiều hơn một ký tự Java, đó là trường hợp của hầu hết tất cả các biểu tượng cảm xúc. Ví dụ: biến thể ví dụ này của bạn sẽ lặp bốn lần thay vì ba lần:for (String s : "x😁z".split("")) { System.out.println(s); }
Bạn cần chuyển đổi đối tượng String thành một mảng char bằng toCharArray
phương thức () của lớp String:
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}
Trong Java 8, chúng ta có thể giải nó như sau:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
Phương thức chars () trả về một IntStream
như đã đề cập trong doc :
Trả về một luồng int zero - mở rộng các giá trị char từ chuỗi này. Bất kỳ char nào ánh xạ tới một điểm mã thay thế đều được chuyển qua không giải thích được. Nếu chuỗi bị đột biến trong khi luồng đang được đọc, kết quả không được xác định.
forEachOrdered
và không forEach
?Hành vi của forEach
không rõ ràng là không forEachOrdered
thực hiện khi hành động thực hiện một hành động cho từng thành phần của luồng này, theo thứ tự bắt gặp của luồng nếu luồng có thứ tự bắt gặp được xác định. Vì vậy, forEach
không đảm bảo rằng thứ tự sẽ được giữ. Ngoài ra kiểm tra câu hỏi này để biết thêm.
Chúng tôi cũng có thể sử dụng codePoints()
để in, xem câu trả lời này để biết thêm chi tiết.
Thật không may, Java không thực String
hiện Iterable<Character>
. Điều này có thể dễ dàng được thực hiện. Có StringCharacterIterator
nhưng điều đó thậm chí không thực hiện Iterator
... Vì vậy, hãy tạo của riêng bạn:
public class CharSequenceCharacterIterable implements Iterable<Character> {
private CharSequence cs;
public CharSequenceCharacterIterable(CharSequence cs) {
this.cs = cs;
}
@Override
public Iterator<Character> iterator() {
return new Iterator<Character>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < cs.length();
}
@Override
public Character next() {
return cs.charAt(index++);
}
};
}
}
Bây giờ bạn có thể (phần nào) dễ dàng chạy for (char c : new CharSequenceCharacterIterable("xyz"))
...
Nếu bạn sử dụng Java 8, bạn có thể sử dụng chars()
trên String
để có được một Stream
nhân vật, nhưng bạn sẽ cần phải cast int
trở lại một char
khi chars()
trở lại một IntStream
.
"xyz".chars().forEach(i -> System.out.print((char)i));
Nếu bạn sử dụng Java 8 với Bộ sưu tập Eclipse , bạn có thể sử dụng phương thức CharAdapter
lớp forEach
với lambda hoặc tham chiếu phương thức để lặp lại tất cả các ký tự trong a String
.
Strings.asChars("xyz").forEach(c -> System.out.print(c));
Ví dụ cụ thể này cũng có thể sử dụng một tham chiếu phương thức.
Strings.asChars("xyz").forEach(System.out::print)
Lưu ý: Tôi là người đi làm cho Bộ sưu tập Eclipse.
Bạn cũng có thể sử dụng lambda trong trường hợp này.
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
Đối với Travers, bạn cũng có thể sử dụng Chuỗi charAt()
với chuỗi.
giống :
String str = "xyz"; // given String
char st = str.charAt(0); // for example we take 0 index element
System.out.println(st); // print the char at 0 index
charAt()
là phương thức xử lý chuỗi trong java giúp Travers chuỗi cho ký tự cụ thể.
for (char st: "xyz".toCharArray()) {}
là gì không?