2014-10-30 75 views
2

通常,ArrayList將很好地打印出原始類型。我需要乾淨地打印出一個ArrayList,就像它對原始類型做的一樣。現在,它給了我這樣的:如何打印ArrayList <Point>

[java.awt.Point[x=8,y=8], java.awt.Point[x=7,y=9], java.awt.Point[x=6,y=8] ...

我只需要打印出來沒有「java.awt.Point中」,我不太擔心的細節。我不知道如果我能做到這一點有一個循環,瞄準的ArrayList索引或...

這是我的代碼,它使一個「機器人」走動一格:

ArrayList<Point> moves = new ArrayList<Point>(); 

// code that moves it one square at a time 
// and then add the move to an array 

moves.add(new Point(this.getX(),this.getY())); // makes a new point, adds it to the array 

,然後再打印:

System.out.println("Robot 1 moves: "+r1.moves); 

我對不同的解決方案完全開放的,如果任何人有一個更好的主意。提前致謝!

+0

你重寫你的toString方法? – 2014-10-30 05:05:03

+0

@KickButtowski假設'Point'是java.awt.Point類,將其擴展爲只覆蓋它的'toString'方法是擴展類的一個不好的理由。最好編寫一個格式化/幫助器來按照你想要的方式格式化字符串。通過這種方式,您可以使用任意數量的格式化程序方法,根據您的需要爲每週的每一天一個格式化程序。 – MadProgrammer 2014-10-30 05:16:30

回答

2

您可以使用增強for loop ...

for (Point p : r1.moves) { 
    System.out.println(p.x + "x" + p.y); 
} 

看看The for Statement(這是對底部)瞭解更多詳情

+0

這是完美的!我知道必須有一個簡單的方法來做到這一點 - 謝謝! – 2014-10-30 05:23:45

+0

很高興幫助... – MadProgrammer 2014-10-30 05:24:02

1

你可能想要創建自己的Point對象(編輯:MadProgrammer相當支持我沒有指出你應該有其他很好的理由擴展或替換內置類的只需要一個自定義的toString()方法),在這種情況下,您可以重寫toString()方法,或創建一個幫助器方法,從您的Points集合中創建一個格式良好的字符串。

例如:

public string MakeNicePointsString(ArrayList<Point> points) 
{ 
    String pointsString = ""; 
    for (int i = 0; i < points.length(); i++) 
    { 
     pointsString += "x=" + points[i].x.toString() + "y=" + points[i].y.toString(); 
    } 

    return pointsString; 
} 
+0

擴展一個類只是爲了修改它的'toString'方法是擴展對象的一個​​非常糟糕的原因。與其試圖「更改」對象,不如寫一個幫助器類/方法,以您的方式對其進行格式化。誰知道,你可能需要原來的'toString'結果來做其他事情....恕我直言 – MadProgrammer 2014-10-30 05:07:58

+0

@MadProgrammer公平點 - 這不是我要做的,而你真的是對的,創建擴展的內置對象的瑣事愚蠢愚蠢的原因是愚蠢的。我已使用您的免責聲明更新了該文章。 – furkle 2014-10-30 05:10:23

+0

更好:)而且你可以提供任意數量的助手來滿足不同的情況;) – MadProgrammer 2014-10-30 05:11:01

0

覆蓋的Point類的toString方法,這樣它將打印x座標x &。

+0

由於drukle已經說過同樣的事情,所以這並沒有增加任何新的東西,只是擴展一個類來修改它的'toString'方法是擴展對象的一個​​非常糟糕的原因。與其試圖「更改」對象,不如寫一個幫助器類/方法,以您的方式對其進行格式化。誰知道,你可能需要原來的'toString'結果來做其他事情....恕我直言 – MadProgrammer 2014-10-30 05:10:03

1

的Java 8解決方案:

moves.stream().forEach((p)-> System.out.print("[" + p.x +"," + p.y + "]")); 

完整的示例:

List<Point> lst = new ArrayList<Point>(); 
    lst.add(new java.awt.Point(1,2)); 
    lst.add(new java.awt.Point(1,8)); 
    lst.add(new java.awt.Point(7,2)); 
    lst.add(new java.awt.Point(6,6)); 
    System.out.print("["); 
    lst.stream().forEach((p)-> System.out.print("[" + p.x +"," + p.y + "]")); 
    System.out.print("]"); 

輸出

[[1,2][1,8][7,2][6,6]] 
0

我知道這是另一種延伸@MadProgrammer的;),因爲它是定義一個匿名的內部類,但是你可以定義一個內聯的overridi納克這樣的toString方法:

Point p = new Point(10, 20){ 
    @Override 
    public String toString(){ 
     return (getX() + ", "+ getY()) + ""; 
    } 
}; 

System.out.println(p); // 10.0, 20.0 

這適用於這種情況下只有