2011-12-26 5 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. Например, я сравниваю GCD трех чисел через цикл for, и затем я хочу добавить новый треугольник в набор (обсуждено here). Я считаю, что знаю все, но создаю новый экземпляр класса, потому что во время цикла мне не удается создать уникальные экземпляры класса треугольника.

Есть ли способ сделать это?

+5

Что это имеет делать с «соглашениями об именах»? –

+2

Название вопроса не имеет никакого отношения к его содержанию. Пожалуйста, отредактируйте его. –

ответ

3

Попробуйте это:

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

набор будет автоматически избежать дубликатов.

+0

Фантастический. Я буду уверен, что у других есть время ответить, но я это сделаю. – nmagerko

+0

Есть ли способ узнать, сколько myTrianlges было добавлено в конце программы? – nmagerko

+0

@nmagerko: Код в ответе, на который вы указали ссылку (http://stackoverflow.com/questions/8620052/check-to-see-if-an-object-has-been-created/8620100#8620100) делает почти точно это ... –

1

Я думаю, вы сделали небольшую ошибку в том, как вы инициализируете объект в конструкторе. Ну, больше, чем ошибка, я бы сказал, проблема дизайна.

Каждый треугольник имеет 3-х сторон, так почему бы вам просто сказать:

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

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

Затем, когда вы создаете объект класса Triangle, вы просто передать ему параметры. Если вы хотите сделать это в цикле, вы могли бы сделать что-то вроде этого:

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

+0

Он сортирует стороны, чтобы гарантировать, что новый Треугольник (2, 3, 4) .equals (новый Треугольник (3, 2, 4)) == true. –

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

+0

Я действительно сожалею, я не имел в виду так. Читая другие ответы, я почувствовал, что они дают слишком мало кода и оставляют слишком много пробелов в предположении, что они будут заполнены. Я просто попытался подчеркнуть тот факт, что я этого не предполагаю. Я никогда не говорил, что неправильно быть разработчиком Java, и определенно не собирался оскорблять кого-либо. Я удалил пропущенную вами строку и с удовольствием удалю любой другой текст, который может быть оскорбительным. Я успешно выполнил мой код и был бы рад помочь, если кто-то не смог сделать то же самое. –

Смежные вопросы