2014-10-30 70 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 

这适用于这种情况下只有