java - 如何编写这个通用目标程序?

标签 java arrays comparator rectangles generic-programming

问题:定义一个提供 getLength 和 getWidth 方法的 Rectangle 类。使用 图1.18中的findMax例程,编写一个创建矩形数组的main 首先根据面积,然后根据周长找到最大的矩形。

到目前为止,我所做的是在构造函数中创建一个带有参数宽度和高度的类矩形。之后,我实现了两个 getter 方法,其中实例变量 width 和 height 为其各自的 getter 方法返回。所以我需要第二部分的帮助。

图1.18

1 // Generic findMax, with a function object.
2 // Precondition: a.size( ) > 0.
3 public static <AnyType>
4 AnyType findMax( AnyType [ ] arr, Comparator<? super AnyType> cmp )
5 {
6 int maxIndex = 0;
7
8 for( int i = 1; i < arr.size( ); i++ )
9 if( cmp.compare( arr[ i ], arr[ maxIndex ] ) > 0 )
10 maxIndex = i;
11
12 return arr[ maxIndex ];
13 }
14
15 class CaseInsensitiveCompare implements Comparator<String>
16 {
17 public int compare( String lhs, String rhs )
18 { return lhs.compareToIgnoreCase( rhs ); }
19 }
20
21 class TestProgram
22 {
23 public static void main( String [ ] args )
24 {
25 String [ ] arr = { "ZEBRA", "alligator", "crocodile" };
26 System.out.println( findMax( arr, new CaseInsensitiveCompare( ) ) )
27 }
28 }

最佳答案

你就快到了。

  • 您不能使用 .size(),它仅适用于 Collection 对象,而不适用于原始数组 - 请改用 .length。
  • 通常使用 E 或 T 表示类型,E 表示元素。
  • 请使用大括号保持代码可读

示例

public static <E> E findMax(E[] arr, Comparator<? super E> cmp) {
    int maxIndex = 0;
    for (int i = 1; i < arr.length; i++) {
        if (cmp.compare(arr[i], arr[maxIndex]) > 0) {
            maxIndex = i;
        }
    }
    return arr[maxIndex];
}

我们需要一个比较器来按区域进行比较。

private static class AreaComparator implements Comparator<Rectangle> {
    public int compare(Rectangle lhs, Rectangle rhs) {
        return Double.compare(lhs.getArea(), rhs.getArea());
        // <== delegate to Double.compare() for nice readable solution
    }
}

还有一个 Rectangle 类,我想你已经有了?这里定义了 getArea()。

private static class Rectangle {
    private double width;
    private double height;
    public Rectangle(double width, double height) {
        super();
        this.width = width;
        this.height = height;
    }
    public double getArea() {
        return width * height;
    }
    @Override
    public String toString() {
        return "Rectangle [width=" + width + ", height=" + height + "]";
    }
}

测试一下

public static void main(String[] args) throws Exception {
    System.out.println(findMax(new Rectangle[] { new Rectangle(1, 2), new Rectangle(3, 4) }, new AreaComparator()));
    System.out.println(findMax(new Rectangle[] { new Rectangle(4, 5), new Rectangle(3, 4) }, new AreaComparator()));
}

关于java - 如何编写这个通用目标程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28425128/

相关文章:

java - 如何使用 Stemmer 或 Lemmatizer 来提取特定单词的词干

java - 从jar中读取资源文件

c - c语言中的数组和函数

Java版本号排序

java - 语句 S 立即包含语句 U 是什么意思?

java - 这么长的一行代码,崩溃的标准是什么

css - 如何使文本与类别数组一起迭代

python - 将带有标题和编码问题的文件读入 numpy 数组

java - 根据方法的结果对 ArrayList 进行排序

c# - Java Comparator 重写 C# 中的等价物