[ 다섯 번째 과제 - SchoolManagerTest ]
[MyComparableInterfaceTest.java]
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
enum OperationKind {ADD_C, ADD_L, LIST, CLEAR, SORT_A, SORT_D, QUIT, INVALID} ;
enum SortKind {ASCENDING, DESCENDING} ;
public class ComparableInterfaceTest {
private static Scanner scanner = new Scanner(System.in);
private static List<MyComparable> comparableList = new ArrayList<MyComparable>() ;
public static void main(String[] args) {
while ( true ) {
final OperationKind op = getOperation() ;
if ( op == OperationKind.QUIT ) {
System.out.println("Bye") ;
break;
}
if ( op == OperationKind.INVALID ) {
System.out.println("Invalid Operation!") ;
continue ;
}
switch ( op ) {
case ADD_L : {
Line newLine = createLine() ;
System.out.println(newLine) ;
break ;
}
case ADD_C : {
Circle newCircle = createCircle() ;
System.out.println(newCircle) ; // got first error at this part
break ;
}
case SORT_A:
sortList(comparableList, SortKind.ASCENDING) ;
break ;
case SORT_D:
sortList(comparableList, SortKind.DESCENDING) ;
break ;
case CLEAR:
comparableList.clear() ;
break ;
case LIST:
System.out.println(comparableList) ;
break ;
}
}
}
private static OperationKind getOperation() {
System.out.print("Enter Operation String! ") ;
String operation = scanner.next() ;
OperationKind kind = OperationKind.INVALID ;
if ( operation.equalsIgnoreCase("ADDL"))
kind = OperationKind.ADD_L ;
if ( operation.equalsIgnoreCase("ADDC"))
kind = OperationKind.ADD_C ;
else if ( operation.equalsIgnoreCase("LIST"))
kind = OperationKind.LIST ;
else if ( operation.equalsIgnoreCase("SORTA"))
kind = OperationKind.SORT_A ;
else if ( operation.equalsIgnoreCase("SORTD"))
kind = OperationKind.SORT_D ;
else if ( operation.equalsIgnoreCase("CLEAR"))
kind = OperationKind.CLEAR ;
else if ( operation.equalsIgnoreCase("QUIT"))
kind = OperationKind.QUIT ;
return kind ;
}
private static void sortList(List<MyComparable> comparableList, SortKind sortKind) {
if (sortKind == SortKind.ASCENDING ) {
for( int i = 0 ; i < comparableList.size()-1 ; i++ ) {
for ( int j = i+1 ; j < comparableList.size() ; j++ ) {
MyComparable tmp = null;
if ( (comparableList.get(i)).compareTo(comparableList.get(j) ) == 1 )
tmp = comparableList.get(i);
comparableList.set(i, comparableList.get(j)) ;
comparableList.set(j, tmp) ;
}
}
}
if ( sortKind == SortKind.DESCENDING ) {
for ( int i = 0 ; i < comparableList.size()-1 ; i++ ) {
for ( int j = i+1 ; j < comparableList.size() ; j++ ) {
MyComparable tmp = null ;
if ( ((comparableList.get(i)).compareTo(comparableList.get(j))) == -1 )
tmp = comparableList.get(i) ;
comparableList.set(i, comparableList.get(j)) ;
comparableList.set(j, tmp);
}
}
}
}
private static Line createLine() {
int x1 = scanner.nextInt() ;
int y1 = scanner.nextInt() ;
int x2 = scanner.nextInt() ;
int y2 = scanner.nextInt() ;
Line newLine = new Line(new Point(x1, y1), new Point(x2, y2)) ;
comparableList.add(newLine) ;
return newLine ;
}
private static Circle createCircle() {
int x = scanner.nextInt() ;
int y = scanner.nextInt() ;
int radius = scanner.nextInt() ;
Circle newCircle = new Circle(new Point(x, y), radius) ;
comparableList.add(newCircle) ;
return newCircle ;
}
}
[MyComparable.java]
public interface MyComparable {
public int compareTo(MyComparable other) ;
public long getSize() ;
}
[Circle.java]
public class Circle implements MyComparable {
private Point center ;
private int radius ;
public Circle(Point point, int radius) {
//center.setX(point.getX()) ; 는 center가 아무것도 가리키지 않기 때문에 쓸 수 없다
//center = new Point(point.getX(), point.getY()) ; sol1 : 새로 만들어서 넣어버리거나
center = point; // sol 2 : 포인터 값을 가져오기
this.radius = radius ;
}
@Override
public int compareTo(MyComparable other) {
long thisSize = getSize() ;
long otherSize = other.getSize() ; // ㅁㅈ?
int returnVal = -2 ;
if ( thisSize > otherSize )
returnVal = 1 ;
else if ( thisSize == otherSize )
returnVal = 0 ;
else
returnVal = -1 ;
return returnVal ;
}
@Override
public long getSize() {
long size = (long) ((Math.PI)*radius*radius) ; // type casting : long
return size ;
}
@Override
public String toString() {
return String.format("[[%d, %d] %d %d]", center.getX(), center.getY(), radius, getSize()) ;
}
}
[Line.java]
public class Line implements MyComparable {
private Point point1, point2 ;
public Line(Point point1, Point point2) {
this.point1 = point1 ;
this.point2 = point2 ;
}
@Override
public int compareTo(MyComparable other) {
long thisSize = getSize() ;
long otherSize = other.getSize() ; // ㅁㅈ?
int returnVal = -2 ;
if ( thisSize > otherSize )
returnVal = 1 ;
else if ( thisSize == otherSize )
returnVal = 0 ;
else
returnVal = -1 ;
return returnVal ;
}
@Override
public long getSize() {
long size = Math.round( Math.sqrt(
(point1.getX()-point2.getX())*(point1.getX()-point2.getX()) +
(point1.getY()-point2.getY())*(point1.getY()-point2.getY()) ) ) ;
return size ;
}
@Override
public String toString() {
return String.format("[%s %s %d]", point1, point2, getSize() ) ;
}
}
[Point.java]
public class Point {
private int x, y ;
public Point(int x, int y) {
this.x = x ;
this.y = y ;
}
public int getX() { return x ; }
public int getY() { return y ; }
public void setX(int x) { this.x = x ;}
public void setY(int y) { this.y = y ;}
public void setPoint(int x, int y) {
this.x = x ;
this.y = y ;
}
@Override
public String toString() {
return String.format("[%d, %d]", x, y) ;
}
}
[실행결과]
Enter Operation String! addc
10 20 10
[[10, 20] 10 314]
Enter Operation String! addl
10 10 20 40
[[10, 10] [20, 40] 32]
Enter Operation String! list
[[[10, 20] 10 314], [[10, 10] [20, 40] 32]]
Enter Operation String! sorta
Enter Operation String! list
[[[10, 10] [20, 40] 32], [[10, 20] 10 314]]
Enter Operation String! clear
Enter Operation String! list
[]
Enter Operation String! addl
10 10 20 30
[[10, 10] [20, 30] 22]
Enter Operation String! addc
10 20 30
[[10, 20] 30 2827]
Enter Operation String! list
[[[10, 10] [20, 30] 22], [[10, 20] 30 2827]]
Enter Operation String! sortd
Enter Operation String! list
[[[10, 20] 30 2827], [[10, 10] [20, 30] 22]]
Enter Operation String! quit
Bye