(将Geometricobject类变成可比较的)修改Geometricobject类以实现Comparable接口,并且在Geometricobject类中定义一个静态的求两个Geometricobject对象中较大者的max方法。画出UML图并实现这个新的Geometricobject类。编写一个测试程序,使用max方法求两个圆中的较大者和两个矩形中的较大者。
package Geometricobject;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Geometricobject<Geometricobject> implements Comparable<Geometricobject> {
public class GeometricobjectCom{
private String color;
private boolean filled;
private Date dateCreated = new Date();
public GeometricobjectCom() {
}
public GeometricobjectCom(String color, boolean filled) {
this.color = color;
this.filled = filled;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return this.color;
}
public void setFilled(boolean filled) {
this.filled = filled;
}
public boolean isFilled() {
return filled;
}
public Date getDateCreated() {
return this.dateCreated;
}
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(dateCreated);
String boo;
if (isFilled() == true) {
boo = "该几何体的颜色已经填充,该颜色是"+ getColor();
}else {
boo = "该几何体的颜色还未填充";
}
return boo+"。该几何体的创建日期是:"+date;
}
}
public static Comparable Max(Comparable object1, Comparable object2) {
if(object1.compareTo(object2) > 0)
return object1;
else
return object2;
}
@Override
public int compareTo(Geometricobject o) {
// TODO Auto-generated method stub
return 0;
}
}
package Geometricobject;
import java.util.Date;
public class Circle1 extends Geometricobject{
private double radius = 0;
private String name;
public Circle1() {
}
public Circle1(String name,double radius) {
this.name = name;
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPerimeter() {
return Math.PI*2*radius;
}
public double getArea() {
double a = Math.pow(radius,2);
return Math.PI*a;
}
public int compareTo(Geometricobject o) {
if(getArea()> ((Circle1) o).getArea()) {
return 1;
}else if(getArea() < ((Circle1) o ).getArea()) {
return -1;
}else
return 0;
}
}
package Geometricobject;
public class HomeworkComparable {
public static void main(String[] args) {
Circle1 circle1 = new Circle1("circle1" , 4);
Circle1 circle2 = new Circle1("circle2",10);
Circle1 circle = (Circle1) Geometricobject.Max(circle1, circle2);
System.out.println("The max circle is " +circle.getName());
System.out.println("The max circle's radius is " +circle.getRadius());
}
}
2.13 (统计一个文件中的字符数、 单词数和行数)编写一个程序,统计一个文件中的字符数、单词数以及行数。单词由空格符分隔,文件名应该作为命令行参数被传递,如图12-13所示。
package statistics;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class statistics {
public static void main(String[] args) throws Exception {
//File file = new File("C:\\Users\\张瘦瘦\\Desktop\\代码\\Java第二次作业\\src\\statistics\\GeometricObject.java");
//File file1 = new File("C:\\Users\\张瘦瘦\\Desktop\\代码\\Java第二次作业\\src\\statistics\\Rational.java");
Scanner input = new Scanner(System.in);
System.out.println("请输入你要扫描数据的文件地址");
String s = input.next();
File file = new File(s);
if(!file.exists()) {
System.out.print("文件不存在");
System.exit(0);
}
Scanner Input1 = new Scanner(file);
Scanner Input2 = new Scanner(file);
sumWordChar(Input1);
sumLine(Input2);
}
public static void sumWordChar(Scanner input) {
int sumWord = 1;
int sumChar = 1;
String s = input.next();
while(input.hasNext()) {
sumWord ++;
sumChar += s.length();
s = input.next();
}
System.out.println("该文件的单词数是:"+sumWord);
System.out.println("该文件的字符数是:"+sumChar);
}
public static void sumLine(Scanner input) {
int sumLine = 0;
while(input.hasNextLine()) {
sumLine++;
input.nextLine();
}
System.out.println("该文件的行数是:"+sumLine);
}
}
package statistics;
// Rational.java: Define a rational number and its associated
// operations such as add, subtract, multiply, and divide
public class Rational extends Number implements Comparable<Rational> {
// Data fields for numerator and denominator
private long numerator = 0;
private long denominator = 1;
/** Default constructor */
public Rational() {
this(0, 1);
}
/** Construct a rational with specified numerator and denominator */
public Rational(long numerator, long denominator) {
long gcd = gcd(numerator, denominator);
this.numerator = ((denominator > 0) ? 1 : -1) * numerator / gcd;
this.denominator = Math.abs(denominator) / gcd;
}
/** Find GCD of two numbers */
private long gcd(long n, long d) {
long t1 = Math.abs(n);
long t2 = Math.abs(d);
long remainder = t1 % t2;
while (remainder != 0) {
t1 = t2;
t2 = remainder;
remainder = t1%t2;
}
return t2;
}
/** Return numerator */
public long getNumerator() {
return numerator;
}
/** Return denominator */
public long getDenominator() {
return denominator;
}
/** Add a rational number to this rational */
public Rational add(Rational secondRational) {
long n = numerator * secondRational.getDenominator() +
denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
/** Subtract a rational number from this rational */
public Rational subtract(Rational secondRational) {
long n = numerator * secondRational.getDenominator()
- denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
/** Multiply a rational number to this rational */
public Rational multiply(Rational secondRational) {
long n = numerator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
/** Divide a rational number from this rational */
public Rational divide(Rational secondRational) {
long n = numerator * secondRational.getDenominator();
long d = denominator * secondRational.numerator;
return new Rational(n, d);
}
@Override
public String toString() {
if (denominator == 1)
return numerator + "";
else
return numerator + "/" + denominator;
}
/** Override the equals method in the Object class */
public boolean equals(Object parm1) {
if ((this.subtract((Rational)(parm1))).getNumerator() == 0)
return true;
else
return false;
}
/** Override the hashCode method in the Object class */
public int hashCode() {
return new Double(this.doubleValue()).hashCode();
}
/** Override the abstract intValue method in java.lang.Number */
public int intValue() {
return (int)doubleValue();
}
/** Override the abstract floatValue method in java.lang.Number */
public float floatValue() {
return (float)doubleValue();
}
/** Override the doubleValue method in java.lang.Number */
public double doubleValue() {
return numerator * 1.0 / denominator;
}
/** Override the abstract longValue method in java.lang.Number */
public long longValue() {
return (long)doubleValue();
}
@Override
public int compareTo(Rational o) {
if ((this.subtract((Rational)o)).getNumerator() > 0)
return 1;
else if ((this.subtract((Rational)o)).getNumerator() < 0)
return -1;
else
return 0;
}
}
package statistics; // GeometricObject.java: The abstract GeometricObject class
public abstract class GeometricObject {
private String color = "white";
private boolean filled;
/**Default construct*/
protected GeometricObject() {
}
/**Construct a geometric object*/
protected GeometricObject(String color, boolean filled) {
this.color = color;
this.filled = filled;
}
/**Getter method for color*/
public String getColor() {
return color;
}
/**Setter method for color*/
public void setColor(String color) {
this.color = color;
}
/**Getter method for filled. Since filled is boolean,
so, the get method name is isFilled*/
public boolean isFilled() {
return filled;
}
/**Setter method for filled*/
public void setFilled(boolean filled) {
this.filled = filled;
}
/**Abstract method findArea*/
public abstract double getArea();
/**Abstract method getPerimeter*/
public abstract double getPerimeter();
}
12.5 (IllegalTriangleException异常)编程练习题11.1定义了带三条边的Triangle类。
- 在三角形中,任意两边之和总大于第三边,三角形类Triangle必须遵从这一规则。
- 创建一个IllegalTriang1eException类,然后修改Triangle类的构造方法,
- 如果创建的三角形的边违反了这一规则,抛出一个IllegalTriangleException对象,如下所示:
//Construct a triangle with the specified sides
public Triangle(double side1, double side2, double side3)
throws IllegalTriangleException {
// Implement it
}
package IllegalTriangleException异常;
public class Triangle {
private double side1;
private double side2;
private double side3;
public Triangle() {
}
public Triangle(double side1,double side2, double side3) throws IllegalTriangleException{
if(side1+side2<side3 || side1+side3<side2 || side2+side3 < side1) {
throw new IllegalTriangleException("在三角形中,任意两边之和总大于第三边");
}
System.out.print("能构成三角形");
}
public double getSide1() {
return side1;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public double getSide2() {
return side2;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public double getSide3() {
return side3;
}
public void setSide3(double side3) {
this.side3 = side3;
}
}
package IllegalTriangleException异常;
public class IllegalTriangleException extends Exception{
public IllegalTriangleException(){
super();
}
public IllegalTriangleException(String message) {
super(message);
}
}
package IllegalTriangleException异常;
public class HomeworkIllegalTriangleException {
//throws用法
//public static void main(String[] args) throws IllegalTriangleException{
//Triangle t = new Triangle(2,3,4);
//}
//try-catch用法:
public static void main(String[] args){
try{
Triangle t = new Triangle(2,3,6);
}catch(IllegalTriangleException ite){
System.out.print("异常信息为:"+ite.getMessage());
}
}
}