Tôi có một ArrayList trong Java, và tôi cần tìm tất cả các lần xuất hiện của một đối tượng cụ thể trong nó. Phương thức ArrayList.indexOf (Object) chỉ tìm thấy một lần xuất hiện, vì vậy có vẻ như tôi cần cái gì khác.Cố gắng tìm tất cả các lần xuất hiện của một đối tượng trong Arraylist, trong java
Trả lời
Tôi không nghĩ bạn cần quá kỳ lạ về nó. Sau đây sẽ làm việc tốt:
static ArrayList<Integer> indexOfAll(Object obj, ArrayList list){
ArrayList<Integer> indexList = new ArrayList<Integer>();
for (int i = 0; i < list.size(); i++)
if(obj.equals(list.get(i)))
indexList.add(i);
return indexList;
}
+ 1, giống như đề xuất của tôi nhưng điều này đã sẵn sàng để sao chép-dán :) –
Điều này có nghĩa là bạn sẽ có danh sách các giá trị bằng nhau. indexOf trả về vị trí (không phải là giá trị) –
Mã tôi đã viết sẽ cung cấp cho bạn các chỉ số của các đối tượng bằng nhau, như được chỉ ra bởi tên biến "indexList". –
lặp qua tất cả các yếu tố, không phá vỡ vòng lặp
mỗi phần tử của ArrayList
so sánh với bạn object
(arrayList.get(i).equals(yourObject)
)
nếu phù hợp hơn so với chỉ số (i) nên được lưu trữ vào một ArrayList riêng (arraListMatchingIndexes).
Đôi khi theo cách này, tôi thực hiện "xóa tất cả", khi tôi cũng cần các vị trí.
Tôi hy vọng điều đó sẽ hữu ích!
Do
for (int i=0; i<arrList.size(); i++){
if (arrList.get(i).equals(obj)){
// It's an occurance, add to another list
}
}
Hope this helps.
không sửa lỗi == nên được sử dụng bằng –
Đã sửa lỗi ngay bây giờ. Cảm ơn –
Tôi giả sử bạn cần lấy tất cả chỉ mục của ArrayList nơi đối tượng trên vị trí đó giống với đối tượng đã cho.
Phương pháp sau đây có thể làm những gì bạn muốn nó làm:
public static <T> int[] indexOfMultiple(ArrayList<T> list, T object) {
ArrayList<Integer> indices = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(object)) {
indices.add(i);
}
}
// ArrayList<Integer> to int[] conversion
int[] result = new int[indices.size()];
for (int i = 0; i < indices.size(); i++) {
result[i] = indices.get(i);
}
return result;
}
Nó tìm kiếm các đối tượng sử dụng phương pháp equals
, và tiết kiệm chỉ số mảng hiện tại vào danh sách với chỉ số. Bạn đang đề cập đến indexOf
trong câu hỏi của bạn, trong đó sử dụng các phương pháp equals
để kiểm tra sự bình đẳng, như đã nói trong tài liệu Java:
Số lượt tìm kiếm sự xuất hiện đầu tiên của lập luận đưa ra, thử nghiệm cho sự bình đẳng bằng cách sử dụng phương pháp
equals
.
Vâng, tôi đã đề cập đến phương pháp indexOf vì tôi đã hy vọng có thể có một phương pháp tương tự thích hợp cho trường hợp của tôi, giống như nó là indexOf (char, int) cho Strings. Cảm ơn câu trả lời và lời giải thích :) – missrg
+1 thực hiện tốt với generics –
này tương tự như answer này, chỉ cần sử dụng stream
API để thay thế.
List<String> words = Arrays.asList("lorem","ipsum","lorem","amet","lorem");
String str = "lorem";
List<Integer> allIndexes =
IntStream.range(0, words.size()).boxed()
.filter(i -> words.get(i).equals(str))
.collect(Collectors.toList());
System.out.println(allIndexes); // [0,2,4]
Bằng cách "đối tượng cụ thể" Ý anh là tài liệu tham khảo nên được 'equals' hoặc' == ' –
Trong trường hợp của tôi nó là một ArrayList của số nguyên, vì vậy cả hai trong số họ có thể được sử dụng. Nhưng thực sự có những trường hợp mà chỉ một trong số họ có thể được sử dụng? – missrg
@missrg .. Luôn sử dụng 'equals' để so sánh nội dung đối tượng. Cho dù 'Integer', hay bất kỳ đối tượng nào khác. –