2017-09-27 2 views
0

Idéalement, je ne veux pas que ce soit statique ou vide. C'est la seule façon de le faire fonctionner pour le moment.Trouver la plus grande surface de divers objets Shape à partir d'une ArrayList

J'ai une superclasse Shape. Il a une méthode de area() que I @Override dans la classe Rectangle et la classe Circle. Dans ma méthode principale utilisant File IO. J'essaie de faire une méthode pour itérer à travers ma liste de formes, pour trouver la plus grande surface().

Je reçois quelques erreurs différentes lorsque j'essaie différentes choses. Quand j'essaie quelque chose comme, Forme plus grand = plus grand.get (0) .area(); J'ai une erreur disant que je ne peux pas convertir un double en forme. Je veux pouvoir obtenir une zone de ma listeList, puis la comparer à d'autres zones de cette ArrayList, et faire une méthode de tri pour trouver la plus grande et la stocker et la renvoyer. Aussi quand j'essaye de le retourner ne me laissera pas parce que ce n'est pas statique.

Mais je ne peux pas rendre mes autres méthodes statiques, cela ne fait pas partie de la conception. Voici une méthode que j'ai essayé avec un foreach, je sais que ce n'est pas correct, mais puis-je l'utiliser potentiellement? Comment puis-je l'obtenir pour stocker l'objet que je crée e sans l'écraser à chaque fois?

Si plus de code téléchargé serait utile s'il vous plaît laissez-moi savoir.

Java

public static void shapeWithLargestArea(ArrayList<Shape> shapes) { 

    for(Shape e: shapes) { 
     double largest = e.area(); 
      if (e.area() > largest) { 
       largest = e.area(); 
      } 
      System.out.println(largest); 
    } // end for each loop 


} // end largest area method 
+0

Mon premier commentaire était pour .net, donc je l'ai enlevé ... mais vous pouvez mettre en œuvre https://docs.oracle.com/javase/7/docs/api /java/lang/Comparable.html, puis trier la collection de sorte que votre la mise en œuvre met la collection en ordre du plus grand au plus petit sur le tri. –

Répondre

1

Votre code ne peut pas compiler avec Shape largest = largest.get(0).area(); parce que votre région méthode() retourne un double et que vous essayez de mettre dans une variable typée avec Shape.

Vous pouvez mettre en œuvre cette

public static Shape shapeWithLargestArea(ArrayList<Shape> shapes) { 
    Shape largestShape = null; 
    for(Shape shape: shapes) { 
     if(largestShape == null || shape.area() > largestShape.area()) 
      largestShape = shape; 
    } 
    return largestShape; 
} 

Mais en java 8, je pense que vous pouvez écrire un code plus élégant avec des flux

écrire une classe de comparaison interne dans votre classe Shape:

private static class ShapeAreaComparator implements Comparator<Shape> { 
    @Override 
    public int compare(Shape s1, Shape s2) { 
     return s1.area().compareTo(s2.area()); 
    } 
} 

et utilisez-le dans une méthode statique de votre classe comme ceci

public static Shape shapeWithLargestArea(ArrayList<Shape> shapes) { 
    return shapes.stream().max(new ShapeAreaComparator()).get(); 
} 

mais votre méthode zone() doit retourner un double et non un double à utiliser la méthode compareTo()

+0

excusez-moi pour les multiples modifications, maintenant je pense que cela fonctionne –

+0

est-ce que ça marche? –

+0

Cela a fonctionné parfaitement. Merci beaucoup. J'adore ForEaches! –

-1

declarition Déplacer la plus grande avant votre boucle pour ne pas l'écraser à chaque fois:

public static Shape shapeWithLargestArea(List<Shape> shapes) { 
    Shape largest = shapes.get(0); 
    for(Shape e: shapes) {   
     if (e.area() > largest.area()) { 
      largest = e; 
     }   
    } 
    System.out.println(largest.area()); 
    return largest; 
} 

ou utiliser list.stream:

public static Shape shapeWithLargestArea2(List<Shape> shapes) { 
    Shape largest = Collections.max(shapes, Comparator.comparing(i -> i.area())); 
    System.out.println(largest.area()); 
    return largest; 
} 
+0

Je pense qu'il veut retourner une forme et non une zone –

+0

Je voudrais éviter le list.stream. Le déplacement de la déclaration en dehors de la boucle imprime toujours chaque itération. Il n'imprime pas seulement le plus gros. –

+0

mettre votre system.out après le pour –