2013-08-08 50 views
9

Tôi muốn thực hiện riêng phương thức toString() cho một ArrayList trong Java. Tuy nhiên, tôi không thể làm cho nó hoạt động ngay cả khi tôi đã thêm toString() như thế này vào lớp có chứa ArrayList.Làm thế nào tôi có thể ghi đè lên phương thức toString của một ArrayList trong Java?

@Override 
public String toString() { 
    String result = "+"; 
    for (int i = 0; i < list.size(); i++) { 
     result += " " + list.get(i); 
    } 
    return result; 
} 

Khi tôi gọi ArrayList như thế này list.toString(), tôi vẫn nhận được biểu diễn mặc định. Tui bỏ lỡ điều gì vậy?

Trả lời

5

Bạn nên làm điều gì đó như

public static String listToString(List<?> list) { 
    String result = "+"; 
    for (int i = 0; i < list.size(); i++) { 
     result += " " + list.get(i); 
    } 
    return result; 
} 

và vượt qua danh sách trong khi một cuộc tranh cãi của listToString(). Bạn có thể về mặt kỹ thuật mở rộng ArrayList (hoặc với một lớp ẩn danh hoặc một lớp cụ thể) và tự mình thực hiện toString, nhưng điều đó dường như không cần thiết ở đây.

+5

Bạn cũng có thể cải thiện hiệu suất bằng cách sử dụng 'StringBuilder' thay vì' String' tại đây. –

7

Bạn không thể ghi đè phương thức toStringArrayList . Thay vào đó, bạn có thể sử dụng một lớp tiện ích chuyển đổi một ArrayList thành một cách bạn muốn/cần. Một giải pháp thay thế khác sẽ sử dụng Arrays.deepToString(yourList.toArray()).

Sử dụng Java 8, điều này có thể được thực hiện rất dễ dàng:

//List<String> list 
System.out.println(String.join(",", list)); 

Hoặc nếu bạn có một List<Whatever>:

System.out.println(
    list.stream() 
     .map(Whatever::getFieldX()) 
     .collect(Collectors.joining(", ")) 
); 

Tôi vẫn chống lại việc mở rộng ArrayList hoặc tương tự, về mặt kỹ thuật có thể nhưng Tôi không thấy nó là một lựa chọn tốt.


bạn có thể mở rộng ArrayList và ghi đè lên toString nhưng nhìn chung đó là không phải là một ý tưởng tuyệt vời. biết thêm thông tin:

+1

Cuối cùng là 'ArrayList'? Bạn có thể không 'mở rộng ArrayList' và ghi đè' toString() '? –

+1

@SteveP. đã cập nhật câu trả lời. –

9
ArrayList<String> list = new ArrayList<String>() 
{ 
    private static final long serialVersionUID = 1L; 

    @Override public String toString() 
    { 
     return super.toString(); 
    } 
}; 
+6

Nhược điểm của phương pháp này là bạn phải tạo một thực hiện ẩn danh mở rộng 'ArrayList' mỗi khi bạn muốn/cần điều này = \. –

+0

Nếu tôi cần nó chỉ một lần, ... – sashok724

+3

Nếu bạn thực sự cần nó một lần, nó sẽ không thực sự hữu ích = \. –

6

Bạn cần phải viết một lớp học kéo dài từ ArrayList:

import java.util.ArrayList; 

public class MyArrayList extends ArrayList { 
    private static final long serialVersionUID = 1L; 

    @Override 
    public String toString() { 
     String result = "+"; 
     for (int i = 0; i < this.size(); i++) { 
      result += " " + this.get(i); 
     } 
     return result; 
    } 
} 
+1

Thật tốt khi làm theo các quy ước đặt tên Java ngay cả đối với mã mẫu nhỏ khi người dùng khác cố gắng học hỏi từ nó. Ở đây: tên lớp nên bắt đầu bằng một chữ cái viết hoa. Nó cũng sẽ là tốt để bao gồm từ "Danh sách" trong tên lớp. – Puce

+0

@Puce Tôi bắt đầu với một bức thư vốn, nhưng có quyền của bạn classname không phải là tốt nhất tôi thay đổi nó –

+0

@ user2426316 hiện điều này đã giúp bạn? –

0

Để ghi đè toString() cho mảng ArrayList Integer:

class MyArrayList extends ArrayList<Integer> { 
    private static final long serialVersionUID = 1L; 
    @Override public String toString() { 
     String output = ""; 
     for (int i = 0 ; i < this.size(); i++) 
      output = Integer.toString(this.get(i)); 
     return output; 
     } 
    } 

ArrayList<Integer> list = 
    new ArrayList<>(Arrays.asList(5, 4, 2, 9, 1, 7)); 
System.out.print("list = " + list); 

sẽ tạo ra: list = [5, 4 , 2, 9, 1, 7]

0

Bạn có thể ghi đè lên phương thức toString trong một lớp mới được tạo nhưng bạn nên đảm bảo lớp được tạo mở rộng Lập danh sách. Sau đó, bạn có thể ghi đè lên phương thức toString. Điều này được dựa trên mối quan hệ IS. Lớp mới tạo ra là một loại ArrayList.

Bạn cũng có thể tạo một ArrayList, dựa trên mối quan hệ HAS. Trong trường hợp này, bạn phải viết một phương thức khác để trả về String thay vì ghi đè phương thức toString.