2015-02-10 1 views
1

Проблема: Определите класс Rectangle, который предоставляет методы getLength и getWidth. Используя подпрограммы findMax на рис. 1.18, напишите главное, которое создает массив Rectangle и находит самый большой прямоугольник сначала по площади, а затем по периметру.Как написать эту общую объектную программу?

Что я сделал до сих пор, это создать прямоугольник класса с параметрами ширины и высоты в конструкторе. После этого я реализовал два метода 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 } 
+0

основном только борется с реализацией с использованием программы findMax и компаратора. Я также создал кучу случайных объектов прямоугольника через массив, как того требует проблема – btrballin

+0

, у вас есть подпрограмма 'findMax'. Все, что вам нужно сделать, это определить свой 'Компаратор ' ы, и вы можете подключиться. –

ответ

0

Вы почти там.

  • Вы не можете использовать .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())); 
}