如何做到类和类之间的比较更多的是用类中的某个值和另一个类中的某只进行比较,其中比较关键的就是重写compareto方法以及实现Comparable接口 ,接着就可以使用arrays中的sort方法进行排序。
这里使用一个例子来体现类和类之间的比较
首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
排序后的各图形类型及面积,格式同排序前的输出;
所有图形的面积总和,格式为Sum of area:总面积值。
输入样例1:
在这里给出一组输入。例如:
1 5 3 2 0
输出样例1:
在这里给出相应的输出。例如:
Wrong Format
输入样例2:
在这里给出一组输入。例如:
4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
输出样例2:
在这里给出相应的输出。例如:
The original list:
Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02
The sorted list:
Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14
Sum of area:106.91
输入样例3:
在这里给出一组输入。例如:
4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 8.4
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
代码:
package TEST;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
abstract class Shape implements Comparable<Shape>{
abstract double getArea();
abstract boolean validate();
abstract double returnarea();
abstract String name();
}
class Circle extends Shape{
private double radius;
private double area;
public Circle(double radius) {
this.radius=radius;
}
String name() {
return "Circle:";
}
double returnarea() {
return area;
}
@Override
double getArea() {
area= 3.1415926*(radius*radius);
return area;
}
@Override
boolean validate() {
// TODO Auto-generated method stub
return false;
}
@Override
public int compareTo(Shape arg0) {
return (int)arg0.returnarea()-(int)area;
}
}
class Rectangle extends Shape{
double width,length,area;
public Rectangle(double width,double length) {
this.length=length;
this.width=width;
}
String name() {
return "Rectangle:";
}
double returnarea() {
return area;
}
@Override
double getArea() {
// TODO Auto-generated method stub
area=width*length;
return area;
}
@Override
boolean validate() {
// TODO Auto-generated method stub
return false;
}
@Override
public int compareTo(Shape arg0) {
return (int)arg0.returnarea()-(int)area;
}
}
class Triangle extends Shape{
double side1,side2,side3,area;
public Triangle(double side1,double side2,double side3) {
this.side1=side1;
this.side2=side2;
this.side3=side3;
}
String name() {
return "Triangle:";
}
double returnarea() {
return area;
}
@Override
double getArea() {
double p=(side1+side2+side3)/2;
area=Math.sqrt((p*(p-side1)*(p-side2)*(p-side3)));
return area;
}
@Override
boolean validate() {
// TODO Auto-generated method stub
return false;
}
@Override
public int compareTo(Shape arg0) {
return (int)arg0.returnarea()-(int)area;
}
}
class Trapezoid extends Shape{
double topSide,bottomSide,height,area;
public Trapezoid(double topSide,double bottomSide,double height) {
this.topSide=topSide;
this.bottomSide=bottomSide;
this.height=height;
}
String name() {
return "Trapezoid:";
}
double returnarea() {
return area;
}
@Override
double getArea() {
area= ((topSide+bottomSide)*height)/2;
return area;
}
@Override
boolean validate() {
// TODO Auto-generated method stub
return false;
}
@Override
public int compareTo(Shape arg0) {
return (int)arg0.returnarea()-(int)area;
}
}
public class Main
{
public static void main(String[] args)
{
int data[] =new int [100],k=0;
Scanner in=new Scanner(System.in);
int n=in.nextInt();
while(n!=0)
{
if(n==1|| n==2|| n==3 || n==4)
{
data[k++]=n;
}
else {
System.out.println("Wrong Format");
return;
}
n=in.nextInt();
}
Shape nshape[] = new Shape[k];
for(int i=0;i<k;i++)
{
if(data[i]==1)
{
double a=in.nextDouble();
if(a>0)
{
nshape[i]=new Circle(a);
nshape[i].getArea();
}
else {
System.out.println("Wrong Format");
return;
}
}
if(data[i]==2)
{
double a=in.nextDouble();
double b=in.nextDouble();
if(a>0&&b>0)
{
nshape[i]=new Rectangle(a,b);
nshape[i].getArea();
}
else {
System.out.println("Wrong Format");
return;
}
}
if(data[i]==3)
{
double a=in.nextDouble();
double b=in.nextDouble();
double c=in.nextDouble();
if(a>0&&b>0&&c>0)
{
if(a+b>c&& a+c>b&& c+b>a)
{
nshape[i]=new Triangle(a, b, c);
nshape[i].getArea();
}
else {
System.out.println("Wrong Format");
return;
}
}
else {
System.out.println("Wrong Format");
return;
}
}
if(data[i]==4)
{
double a=in.nextDouble();
double b=in.nextDouble();
double c=in.nextDouble();
if(a>0&& b>0 && c>0)
{
nshape[i]=new Trapezoid(a, b, c);
nshape[i].getArea();
}
else {
System.out.println("Wrong Format");
return;
}
}
}
System.out.println("The original list:");
for(int i=0;i<k;i++)
{
System.out.printf("%s%.2f ",nshape[i].name(),nshape[i].returnarea());
}
Arrays.sort(nshape);//这里就是将类和类之间进行排序,会默认去调用compareto方法去尝试比较,比较后再进行排序
System.out.println();
System.out.println("The sorted list:");
for(int i=0;i<k;i++)
{
System.out.printf("%s%.2f ",nshape[i].name(),nshape[i].returnarea());
}
double sum=0;
for(int i=0;i<k;i++)
{
sum=sum+nshape[i].returnarea();
}
System.out.println();
System.out.printf("Sum of area:%.2f",sum);
}
}