2011-12-26 31 views
0

我试图创建一个通过存储在下面的类的双方产生三角形的程序:名称的新实例在Java中

class Triangle { 
    private int[] sides; 

    public Triangle(int x, int y, int z) { 
     sides = new int[] {x,y,z}; 
     Arrays.sort(sides); 
    } 

    @Override public boolean equals(Object o) { 
     return o instanceof Triangle && Arrays.equals(sides, ((Triangle) o).sides); 
    } 

    @Override public int hashCode() { 
     return Arrays.hashCode(sides); 
    } 

    @Override public String toString() { 
     return Arrays.toString(sides); 
    } 
} 

的问题是,我不知道如何创建一个新的实例这些来自for循环的三角形。例如,我通过一个for循环比较三个数字的GCD,然后我想在一个集合中添加一个新的三角形(讨论here)。我相信我知道如何创建一个新的类的实例,因为在循环过程中,我无法创建三角形类的独特实例。

有没有办法做到这一点?

+5

这是什么都处理“命名约定”? – 2011-12-26 17:28:25

+2

问题的标题与其内容无关。请编辑它。 – 2011-12-26 17:28:54

回答

3

试试这个:

Set<Triangle> myTriangles = new LinkedHashSet<Triangle>(); 
for (something here) { 
    myTriangles.add(new Triangle(a, b, c)); 
} 

的设置会自动避免重复。

+0

太棒了。我会确保其他人有时间来回答,但我会执行此操作。 – nmagerko 2011-12-26 17:40:20

+0

有什么方法可以找到程序结尾处添加了多少个myTrianlges? – nmagerko 2011-12-26 17:44:03

+0

@nmagerko:你提供了一个链接的答案中的代码(http://stackoverflow.com/questions/8620052/check-to-see-if-an-object-has-been-created/8620100#8620100)几乎完全是这样... – 2011-12-26 17:45:02

1

我想你在构造函数中初始化对象的方式上犯了一个小错误。 不仅仅是一个错误,我会说设计问题。

每个三角形有3个边,所以你为什么不只是说:

public Triangle(int x, int y, int z) { 
     sides = new int[3]; 

     sides[0] = x; 
     sides[1] = y; 
     sides[2] = z; 
    } 

然后,当你创建的类三角形的物体,你只要传递参数给它。如果你想这样做在一个循环中,你可以做这样的事情:

public static void main(String [] args) { 

    Scanner sc = new Scanner(System.in); 
     System.out.print("How many triangles do you want?") 
    int noOfTriangles = sc.nextInt(); 

    Triangle[] triangles = new Triangle[noOfTriangles]; 

    for(int i = 0; i < triangles.length; i++) { 
      System.out.print("Creating triangle " + (i+1)) 
      System.out.print("Enter a value for side X") 
      int x =sc.nextInt(); 
      System.out.print("Enter a value for side Y") 
      int y =sc.nextInt(); 
        System.out.print("Enter a value for side Z") 
      int z =sc.nextInt(); 

      triangles[i] = new Triangle(x,y,z); 
    } 

} 

在那里,你现在去,你有初始化所有对象和值组三角形的数组。

+0

我不知道我想要多少个三角形。你的建议是我已经知道结果,但我不知道。 – nmagerko 2011-12-26 17:43:19

+0

他对两侧进行排序以确保新三角形(2,3,4).equals(新三角形(3,2,4))== true。 – 2011-12-26 17:44:25

1

我看了其他帖子,并加了a running code of my own。也许你应该看看那里。它产生三角形和一切。 无论如何,这不是一个“命名约定”的问题,如果将问题改为“如何在java中创建实例”,可能会得到正确的反馈。

完整的代码我写的有(如果你不喜欢点击链接)在这里以及在任何空白其他人离开应填写为您填写:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 
public class Triangle 
{ 
    private int[]sides; 
    public Triangle(int x, int y, int z) 
    { 
     sides = new int[]{x,y,z}; 
     Arrays.sort(sides); 
    } 

    public Triangle(String ... args) 
    { 
     this(Integer.parseInt(args[0].trim()), Integer.parseInt(args[1].trim()), Integer.parseInt(args[2].trim())); 
    } 

    @Override 
    public boolean equals(Object o) 
    { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Triangle triangle = (Triangle) o; 

     if (!Arrays.equals(sides, triangle.sides)) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() 
    { 
     return sides != null ? Arrays.hashCode(sides) : 0; 
    } 

    @Override 
    public String toString() 
    { 
     return "Triangle{" + 
         "sides=" + Arrays.toString(sides) + 
         '}'; 
    } 

    public static void main(String[] args) throws IOException 
    { 

     String[] input = new String[]{ "1,2,1" , "1,1,2", "1,2,3","1,3,1","1,1,1","1,3,3","1,1,3"}; 

     Set<Triangle> triangles = new HashSet<Triangle>(); 
     for (String s : input) 
     { 
      triangles.add(new Triangle(s.split(","))); 
     } 
     System.out.println("triangles = " + triangles); 
    } 
} 
+0

你显然不明白这个网站。这里提出问题的人不一定是Java开发人员。我绝对认为你的侮辱在这个意义上也是不合理的。我也不赞赏你给出了“答案”(顺便说一句,这是错误的)。引导用户回答,不要给他们。 – nmagerko 2011-12-26 18:06:40

+0

我真的很抱歉,我不是那个意思。在阅读其他答案时,我感觉他们给出的代码太少,并且在假设他们将被填充时留下太多空白。我只是试图强调我不认为这一事实。我从来没有说过不是一个Java开发人员是错的,绝对没有打算侮辱任何人。我删除了您评论的那一行,并很乐意删除任何可能有侮辱性的文字。我成功地运行了我的代码,如果有人不这样做,我会很乐意提供帮助。 – 2011-12-26 18:36:42