尺寸比较(周长/平方周长)等

时间:2018-11-10 12:54:59

标签: java

3个不同的classes 1用于处理Circle个实例,1个用于Square实例,第3个用于comparrisons实例(main)。在main函数中,找到circle(在c1..c4之间)和square(在s1...s5之间)并打印biggest circumference and area of them respectively。 -圆和平方平方比较]

!!!!注意: 只有半径或边较大的那些具有最大的周长或面积,因此我仅使用ra进行比较。我不知道是否可能如果我使用this / area方法返回circumference(否,因为那我只会处理数字?)。请更正我。

现在我想用geometric shape打印biggest perimeter(圆形/正方形)的特征(x,y,r / a)。我怎样才能做到这一点 ?我在哪里比较?新课?[方圆比较]

public class Circle {
        public double x,y,r;
        public double circumference() {
            return 2*(3.14)*r;
        }
        public double area() {
            return 3.14*r*r;
        }
        public Circle bigger(Circle c){
            if(c.r>r) return c; else return this; 
        } 
        public Circle(double x, double y, double r) {
            this.x=x; 
            this.y=y; 
            this.r=r;
        }
    }

public class Square {
    public double x,y,a;
    public double perimeter() {
        return 4*a;
    }
    public double area() {
        return a*a;
    }
    public Square bigger(Square s){
        if(s.a>a) return s; else return this; 
    } 
    public Square(double x, double y, double a) {
        this.x=x; 
        this.y=y; 
        this.a=a;
    }
}

public class CircleAndSquareTest {

    public static void main(String[] args) {
        Circle c1 = new Circle(0.0,0.0,1.0);
        Circle c2 = new Circle(1.0,0.0,2.0);
        Circle c3 = new Circle(0.0,2.0,4.0);
        Circle c4 = new Circle(1.0,3.0,1.0);
        Circle cb = c1.bigger(c2).bigger(c3).bigger(c4);
        System.out.println("The circle with the biggest circumference has:\n");
        System.out.println("x-axis value: " + cb.x + " y-axis value: " + cb.y + " radius: " + cb.r+"\n");

        Square s1 = new Square(0.0,0.0,1.0);
        Square s2 = new Square(0.0,0.0,1.0);
        Square s3 = new Square(0.0,0.0,5.0);
        Square s4 = new Square(4.0,2.0,2.0);
        Square s5 = new Square(0.0,0.0,1.0);
        Square sb = s1.bigger(s2).bigger(s3).bigger(s4).bigger(s5);
        System.out.println("The square with the biggest area has:\n");
        System.out.println("x-axis value: " + sb.x + " y-axis value: " + 
        sb.y + " side: " + sb.a);
    }
}

2 个答案:

答案 0 :(得分:1)

首先声明一个基本接口(可能称为Shape),该接口定义了方法 getPerimeterLength()

让您所有的形状类都实现该接口以及相应的方法。

现在,正方形也是形状,圆形也是。然后,您可以将所有这些对象放入Shape数组中。您迭代该数组,并标识出具有最大周长的条目。然后,您只需在该对象上调用 toString()。因为您还将覆盖所有类中的 toString()方法,以打印每个类内部具有的(不同!)详​​细信息。

答案 1 :(得分:1)

这是使用Comparators和Collections类查找最大值的方法。这未经测试,但它应该做您想要的。请注意,我在这里使用静态内部类,但是如果需要,它们可以是在自己的文件中定义的标准类-这只是为了创建快速答案。

public interface Shape {
    double getPerimeter();
    double getArea();
}

public static class PerimeterComparator implements Comparator<Shape> {
    @Override
    public int compare(Shape a, Shape b) {
        return Double.compare(a.getPerimeter(), b.getPerimeter());
    }
}

public static class AreaComparator implements Comparator<Shape> {
    @Override
    public int compare(Shape a, Shape b) {
        return Double.compare(a.getArea(), b.getArea());
    }
}

public static class Circle implements Shape {
    private final double x, y, r;

    @Override
    public double getPerimeter() {
        return 2 * (3.14) * r;
    }

    @Override
    public double getArea() {
        return 3.14 * r * r;
    }

    public Circle(double x, double y, double r) {
        this.x = x;
        this.y = y;
        this.r = r;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public double getR() {
        return r;
    }
}

public static class Square implements Shape{
    private final double x, y, a;

    @Override
    public double getPerimeter() {
        return 4 * a;
    }

    @Override
    public double getArea() {
        return a * a;
    }

    public Square(double x, double y, double a) {
        this.x = x;
        this.y = y;
        this.a = a;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public double getA() {
        return a;
    }
}


public static void main(String[] args) {
    List<Shape> shapes = new ArrayList<>();
    List<Circle> circles = new ArrayList<>();
    circles.add(new Circle(0.0,0.0,1.0));
    circles.add(new Circle(1.0,0.0,2.0));
    circles.add(new Circle(0.0,2.0,4.0));
    circles.add(new Circle(1.0,3.0,1.0));

    Circle largestCircle = Collections.max(circles, new PerimeterComparator());

    System.out.println("The circle with the biggest circumference has:\n");
    System.out.println("x-axis value: " + largestCircle.getX() + " y-axis value: " + largestCircle.getY() + " radius: " + largestCircle.getPerimeter() +"\n");

    List<Square> squares = new ArrayList<>();
    squares.add(new Square(0.0,0.0,1.0));
    squares.add(new Square(0.0,0.0,1.0));
    squares.add(new Square(0.0,0.0,5.0));
    squares.add(new Square(4.0,2.0,2.0));
    squares.add(new Square(0.0,0.0,1.0));

    Square largestSquare = Collections.max(squares, new PerimeterComparator());

    System.out.println("The square with the biggest area has:\n");
    System.out.println("x-axis value: " + largestSquare.getX() + " y-axis value: " + largestSquare.getY() + " side: " + largestSquare.getA());

    shapes.addAll(circles);
    shapes.addAll(squares);

    Shape largestPerimeter = Collections.max(shapes, new PerimeterComparator());
    Shape largestArea      = Collections.max(shapes, new AreaComparator());

    System.out.printf("\nThe shape with the biggest perimeter is a %s and has has: a perimeter of: %f\n", largestPerimeter.getClass().getSimpleName(), largestPerimeter.getPerimeter());
    System.out.printf("The shape with the biggest area is a %s and has has: an area of: %f\n", largestArea.getClass().getSimpleName(), largestArea.getArea());
}