(1.定义一个ReList接口,并使用数组的方法来实现接口。
要求:
1. ReList接口包含六个方法:
void add(Object obj):往列表尾部添加对象
Object get(int index):从列表中获取索引为i的对象
void clear():清空所有的对象
boolean isEmpty():判断列表中是否有对象
int size():获取列表中对象的个数
int capacity():所分配的空间大小
2. ReArrayList类实现ReList接口,内部以数组的方式实现,要求:
构造函数ReArrayList(int incSize):参数incSize为数组初始化大小和空间的增量。若用户调用incSize非法,则设为默认值5。
当调用add()方法往试图往ReArrayList中增加对象时,如果内部数组已满,则增加数组大小,增量为incSize。
调用clear()方法可以清空所有通过add()方法加入的对象。
调用get()方法时,如果传入的参数非法,则返回null对象,并使用System.err提示用户参数错误。
3. ReDoubledArrayList类也实现ReList接口,内部依旧通过数组实现,要求:
构造函数ReDoubledArrayList(int initSize):参数initSize表示数组的初始化大小。若用户调用initSize非法,则设为默认值10。
当调用add()方法往ReDoubledArrayList列表里面增加对象时,如果其内部数组已满,则将数组的长度变为当前长度的2倍。
其他方法和ReArrayList一致
最后设计一个类来测试你的ReArrayList和ReDoubledArrayList类,看看这两个类是否能在不破坏使用者代码的情况下相互替换。
提示:
1. 增加数组长度的方法:使用java.util.Arrays.copyOf()方法,用法请查阅Java API文档。
Stuednt.java
package shiyan3_4;
public class Stuednt {
publicString toString() {
return "Stuednt [name=" + name + ",
age=" + age + "]";
}
privateString name;
private int age;
publicStuednt(String name,int age) {
this.name=name;
this.age=age;
}
publicString getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
ReList.java
package shiyan3_4;
public interface ReList {
public void add(Object obj);
public Object get(int index);
public void clear();
public booleanisEmpty();
public int size();
public int capacity();
}
ReArrayList.java
package shiyan3_4;
import java.util.Arrays;
public class ReArrayList implementsReList{
private int size;
private Object[] example;
publicReArrayList(int incSize) {
if(incSize<0){
this.size=5;
}else{
this.size=incSize;
}
this.example = new Object[size];
System.out.println("数组初始化成功,增量为=:"+size);
}
public void add(Object obj) {
System.out.println("执行add函数,添加元素:"+obj);
for(int i=0;i<example.length;i++){
if(example[i]==null){
example[i]=obj;
return;
}
}
System.out.println("数组已满,增加容量"+size);
this.example= Arrays.copyOf(example, example.length+size);
System.out.println("新数组长度为:="+example.length);
System.out.println("数组内部元素:="+this);/*那么 System.out.println(this) 将打印A类自身引用的toString方法, 如果自身没有实现,则打印的是父类Object的toString方法;getClass().getName()+
"@" +Integer.toHexString(hashCode()); 打印的是“类名@hascode”*/
this.add(obj);
}
publicObject get(int index) {
System.out.println("执行查找指定脚标元素:");
if(index>=example.length){
System.err.println("参数错误!"+index);
return null;
}
return example[index];
}
public void clear() {
this.example = new Object[size];
System.out.println("数组已清空,当前数组长度为:="+example.length);
}
public boolean isEmpty() {
System.out.println("isEmpty判断非空,数组元素:"+this);
for(Objecto : example){
if(o!=null)
return false;
}
return true;
}
public int size() {
System.out.println("数组大小为:=");
return (int)Arrays.stream(example).filter(e->e!=null).count();//过滤
}
public int capacity() {
System.out.println("分配的大小为:=");
return example.length;
}
publicString toString() {
return "ReArrayList [size=" + size + ",
example="+ Arrays.toString(example) + "]";
}
}
Ceshi.java
package shiyan3_4;
public class ceshi {
public static void main(String[] args) {
ReArrayListar = new ReArrayList(2);
ar.add(new Stuednt("小红",14));
ar.add(new Stuednt("小白",17));
ar.add(new Stuednt("小黄",11));
ar.add(new Stuednt("小蓝",13));
ar.add(new Stuednt("小青",14));
ar.add(new Stuednt("小紫",12));
System.out.println(ar);
System.out.println(ar.get(3));
System.out.println(ar.size());
System.out.println(ar.isEmpty());
System.out.println(ar.capacity());
ar.clear();
System.out.println(ar);
System.out.println(ar.size());
System.out.println(ar.isEmpty());
System.out.println(ar.capacity());
}
}
(2.假设默认长度单位为米,编写一个计算为各种形状着色花费的程序。
要求:
1. 编写BorderColorable接口,要求:
具有方法void paintBorder(),在实现类中该方法需要输出“已经将什么形状的边着色”。
方法boolean isBorderPainted(),返回形状的边是否已经着色。
2. 编写SolidColorable接口,要求:
具有方法void paintShape(),在实现类中该方法需要输出“已经将什么形状进行着色”。
方法boolean isShapePainted(),返回形状是否已经着色。
3. Shape2D是所有形状的父类:
其中圆(Circle),三角形(Triangle)和长方形(Rectangle)均继承自Shape2D类,而Square继承自Rectangle类。
Circle实现了BorderColorable接口,Triangle实现了SolidColorable接口,而Rectangle同时实现了BorderColorable接口和SolidColorable接口。
4. CostCalculator类用来计算为边着色和为形状着色所消耗的花费。
构造函数CostCalculator(double
borderCost, double solidCost),其中borderCost表示画1米的边需要的单价,solidCost表示画一平方米的边需要消耗的单价。
double calculate(Shape2D shape)用来计算实际为形状shape着色需要的花费。
形状着色的花费计算值计算已经着色的部分,且花费总额为边着色和为形状着色的花费的总和。
5. 写一个测试类测试你的程序。
提示:
1. 实现了BorderColorable的形状只为边着色,实现了SolidColorable的形状为整个形状着色。
2. 总体类图如下图所示。
BorderColorable.java
package shiyan4_2;
public interface BorderColorable {
public void paintBorder();
public boolean isShapeBorder();
}
Circle.java
package shiyan4_2;
public class Circle extendsShape2D implements BorderColorable{
private double r;
private boolean flag1 = false;
private boolean flag2 = false;
private double Area;
private double Perimeter;
public double getArea() {
return Area;
}
public void setArea(double area) {
Area = area;
}
public double getPerimeter() {
return Perimeter;
}
public void setPerimeter(double perimeter) {
Perimeter = perimeter;
}
publicCircle(Double radius) {
r=radius;
}
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
public void area() {
double PI =
(float) Math.PI;
System.out.println("圆的面积为:"+PI*getR()*getR()
);
setArea(PI*getR()*getR());
}
public void perimeter() {
double PI =(float) Math.PI;
System.out.println("圆的周长为:"+2*PI*getR());
setPerimeter(2*PI*getR());
}
public void paintBorder(){
flag1=true;
System.out.println("正在为圆形的边着色~~");
}
public void paintShape(){
flag2=true;
System.out.println("正在为圆形的内部着色~~");
}
public boolean isShapeBorder() {
if (flag1)
return true;
else
return false;
}
public boolean isShapePainted() {
if (flag2)
return true;
else
return false;
}
}
CostCalculator.java
package shiyan4_2;
public class CostCalculator {
private double borderCost,soliderCost;
public double getBorderCost() {
return borderCost;
}
public void setBorderCost(double borderCost) {
this.borderCost = borderCost;
}
public double getSoliderCost() {
return soliderCost;
}
public void setSolidCost(double solidCost) {
this.soliderCost = solidCost;
}
public CostCalculator(double borderCost, double solidCost) {
this.borderCost=borderCost;
this.soliderCost=solidCost;
}
public double calculate(Shape2D shape){
double s1=0,s2=0;
if(shape.isShapeBorder()){
s1=shape.getPerimeter()*this.borderCost;
}
if(shape.isShapePainted()){
s2=shape.getArea()*this.soliderCost;
}
return s1+s2;
}
}
Rectangle.java
package shiyan4_2;
public class Rectangle extendsShape2D implements SoliderColorable ,BorderColorable{
private boolean flag1 = false;
private boolean flag2 = false;
private double Area;
private double Perimeter;
private double l,h;
publicRectangle(double l,double h) {
this.h=h;
this.l=l;
}
public double getL() {
return l;
}
public void setL(double l) {
this.l = l;
}
public double getH() {
return h;
}
public void setH(double h) {
this.h = h;
}
public double getArea() {
return Area;
}
public void setArea(double area) {
Area = area;
}
public double getPerimeter() {
return Perimeter;
}
public void setPerimeter(double perimeter) {
Perimeter = perimeter;
}
public void paintBorder(){
flag1=true;
System.out.println("正在为长方形的边着色~~");
}
public void paintShape(){
flag2=true;
System.out.println("正在为长方形的内部着色~~");
}
public boolean isShapeBorder() {
if (flag1)
return true;
else
return false;
}
public boolean isShapePainted() {
if (flag2)
return true;
else
return false;
}
public void perimeter() {
double ll =
2*getH()+2*getL();
System.out.println("长方形周长为:"+ll);
setPerimeter(ll);
}
public void area() {
System.out.println("长方形面积为:"+getH()*getL());
setArea(getH()*getL());
}
}
Shape2D.java
package shiyan4_2;
public abstract class Shape2D {
public abstract void perimeter();
public abstract void area();
public abstract boolean isShapeBorder() ;
public abstract boolean isShapePainted();
public abstract double getArea() ;
public abstract double getPerimeter();
}
SoliderColorable.java
package shiyan4_2;
public interface SoliderColorable {
public void paintShape();
public boolean isShapePainted();
}
Square.java
package shiyan4_2;
public class Square extendsRectangle {
private double a = 0;
private boolean flag1 = false;
private boolean flag2 = false;
private double Area;
private double Perimeter;
public double getArea() {
return Area;
}
public void setArea(double area) {
Area = area;
}
public double getPerimeter() {
return Perimeter;
}
public void setPerimeter(double perimeter) {
Perimeter = perimeter;
}
publicSquare(double width) {
super(width,width);
if (width>0) {
this.a = width;
System.out.println("构成了一个边长为:"+this.a+"的正方形");
setSuccess(true);
}else {
setSuccess(false);
}
}
private void setSuccess(boolean b) {
if(b){
}else{
System.out.println("创建失败,输入有问题。");
}
}
public double getA() {
return a;
}
public void setA(double a) {
this.a = a;
}
public void area() {
this.setArea(getA()
* getA());
System.out.println("正方形面积为:" +
getA() * getA());
}
public void perimeter() {
this.setPerimeter(getA() * 4);
System.out.println("正方形周长为:" +
getA() * 4);
}
public void paintBorder(){
flag1=true;
System.out.println("正在为正方形的边着色~~");
}
public void paintShape(){
flag2=true;
System.out.println("正在为正方形的内部着色~~");
}
public boolean isShapeBorder() {
if (flag1)
return true;
else
return false;
}
public boolean isShapePainted() {
if (flag2)
return true;
else
return false;
}
}
Test.java
package shiyan4_2;
import java.util.Scanner;
public class Test {
public static void main(String[] agrs){
Scannerinput=new Scanner(System.in);
CostCalculatorcost=new CostCalculator(1.0,2.0);//边的花费,内部的花费
System.out.println("着色一米的边长需要:"+cost.getBorderCost()+"RMB "+"着色l平方米需要:"+cost.getSoliderCost()+"RMB");
double radius=0;
double height=0,width=0;
double left=0,right=0,boom=0;
//*******圆*******
System.out.print("请输入圆的半径:");
radius=input();
Circlecircle=new Circle(radius);
circle.area();
circle.perimeter();
circle.paintBorder();//为边着色
System.out.println("花费为:"+cost.calculate(circle));
//*******长方形*******
System.out.print("请输入长方形的长:");
height=input();
System.out.print("请输入长方形的宽:");
width=input();
Rectanglerectangle=new Rectangle(height,width);
rectangle.area();
rectangle.perimeter();
rectangle.paintBorder();//为边着色
rectangle.paintShape();//为内部着色
System.out.println("花费为:"+cost.calculate(rectangle));
//******正方形******
System.out.print("请输入正方形的边长:");
width=input();
Squaresquare=new Square(width);
square.area();
square.perimeter();
square.paintBorder();//为内部着色
square.paintShape();
System.out.println("花费为:"+cost.calculate(square));
//******三角形******
do{
System.out.print("请输入三角形的第一边长:");
left=input();
System.out.print("请输入三角形的第二边长:");
right=input();
System.out.print("请输入三角形的第三边长:");
boom=input();
}while(!judge(left,right,boom));
Triangletriangle=new Triangle(left,right,boom);;
triangle.area();
triangle.perimeter();
triangle.paintBorder();//为边着色
triangle.paintShape();//为内部着色
System.out.println("花费为:"+cost.calculate(triangle));
input.close();
}
public static boolean judgement(double r){
if(r<0){
System.out.println("输入错误,请重新输入");
return false;
}
return true;
}
public static double input(){
double temp=0;
boolean flag=true;
Scannerinput=new Scanner(System.in);//不能关闭否则无限循环
do{
flag=true;
input=new Scanner(System.in);
if(input.hasNextDouble()){
temp=input.nextDouble();
if(temp>0){
flag=false;
break;
}
}
System.out.println("输入必须是double型,并且大于0,请重新输入");
}while(flag);
return temp;
}
public static boolean judge(double right,double left,double boom){
if(right<=0 || left<=0 || boom<=0){
System.out.println("输入不满足三角形构造规则,请重新输入");
return false;
}
if(right+left<=boom ||right+boom<=left ||boom+left<=right){
System.out.println("输入不满足三角形构造规则,请重新输入");
return false;
}
if(right-left>=boom ||right-boom>=left ||boom-left>=right){
System.out.println("输入不满足三角形构造规则,请重新输入");
return false;
}
return true;
}
}
Triangle.java
package shiyan4_2;
public class Triangle extendsShape2D implements SoliderColorable{
private double length1;
private double length2;
private double length3;
private boolean flag1 = false;
private boolean flag2 = false;
private double Area;
private double Perimeter;
public double getArea() {
return Area;
}
public void setArea(double area) {
Area = area;
}
public double getPerimeter() {
return Perimeter;
}
public void setPerimeter(double perimeter) {
Perimeter = perimeter;
}
publicTriangle(double length1, double length2, double length3) {
// TODO Auto-generated constructor stub
super();
this.length1 = length1;
this.length2 = length2;
this.length3 = length3;
if((Math.abs(this.length1 - this.length2) < this.length3)
&& (Math.abs(this.length1 - this.length3) < this.length2)
&& (Math.abs(this.length3 - this.length2) < this.length1)
&& (Math.abs(this.length1 + this.length2) > this.length3)
&& (Math.abs(this.length1 + this.length3) > this.length2)
&& (Math.abs(this.length3 + this.length2) > this.length1)) {
setSuccess(true);
System.out.println("构成了一个三条边长分别为:" + this.length1 + ","
+this.length2 + "," + this.length3 + "的三角形");
}else {
setSuccess(false);
}
}
private void setSuccess(boolean b) {
if(b){
}else{
System.out.println("创建失败,输入有问题。");
}
}
public double getLength1() {
return length1;
}
public void setLength1(double length1) {
this.length1 = length1;
}
public double getLength2() {
return length2;
}
public void setLength2(double length2) {
this.length2 = length2;
}
public double getLength3() {
return length3;
}
public void setLength3(double length3) {
this.length3 = length3;
}
public void area() {
double p =
(getLength1() + getLength2() + getLength3()) / 2;
System.out.println("面积为:"
+ Math.sqrt(p *
(p -
getLength1()) * (p - getLength2())
* (p -
getLength3())));
this.setArea(Math.sqrt(p *
(p -
getLength1()) * (p - getLength2())
* (p -
getLength3())));
}
public void perimeter() {
System.out.println("周长为:"
+ (getLength1() + getLength2()+ getLength3()));
this.setPerimeter((getLength1()
+ getLength2() + getLength3()));
}
public void paintBorder(){
flag1=true;
System.out.println("正在为三角形的边着色~~");
}
public void paintShape(){
flag2=true;
System.out.println("正在为三角形的内部着色~~");
}
public boolean isShapeBorder() {
if (flag1)
return true;
else
return false;
}
public boolean isShapePainted() {
if (flag2)
return true;
else
return false;
}
}