Theatre.java
import java.util.ArrayList;
import java.util.List;public class Theatre {
private final String theatreName;
private List<Seat> seats = new ArrayList<>(); public Theatre(String theatreName, int numRows, int seatsPerRow) {
this.theatreName = theatreName; int lastRow = 'A' + (numRows - 1);
for (char row = 'A'; row <= lastRow; row++) {
for (int seatNum = 1; seatNum <= seatsPerRow; seatNum++) {
Seat seat = new Seat(row + String.format("%02d", seatNum));
seats.add(seat);
}
}
} public String getTheatreName() {
return theatreName;
} public boolean reserveSeat(String seatNumber) {
Seat requestSeat = null;
for (Seat seat : seats) {
if (seat.getSeatNumber().equals(seatNumber)) {
requestSeat = seat;
break;
}
} if (requestSeat == null) {
System.out.println("There is no seat " + seatNumber);
return false;
} return requestSeat.reserve();
} // for testing
public void getSeats() {
for (Seat seat : seats) {
System.out.print(seat.getSeatNumber() + " ");
// each 10 seat print out to next line
if ((seats.indexOf(seat) + 1) % 10 == 0) {
System.out.println();
}
}
} private class Seat {
private final String seatNumber;
private boolean reserved = false; public Seat(String seatNumber) {
this.seatNumber = seatNumber;
} public boolean reserve() {
if (!reserved) {
reserved = true;
System.out.println("Seat " + seatNumber + " reserved.");
return true;
} else {
return false;
} } public boolean cancel() {
if (reserved) {
reserved = false;
System.out.println("Reservation of seat " + seatNumber + "cancelled");
return true;
} else {
return false;
} } public String getSeatNumber() {
return seatNumber;
}
}
}
MainTheatre.java
public class MainTheatre {
public static void main(String[] args) {
Theatre theatre = new Theatre("Muzha Guangming", 8, 10);
theatre.getSeats();
if (theatre.reserveSeat("E05")) {
System.out.println("Okay, this seat is yours, one seat is $1");
} else {
System.out.println("Sorry, this seat is sold out already.");
}
if (theatre.reserveSeat("E05")) {
System.out.println("Okay, this seat is yours, one seat is $1");
} else {
System.out.println("Sorry, this seat is sold out already.");
}
}}
輸出結果:
A01 A02 A03 A04 A05 A06 A07 A08 A09 A10
B01 B02 B03 B04 B05 B06 B07 B08 B09 B10
C01 C02 C03 C04 C05 C06 C07 C08 C09 C10
D01 D02 D03 D04 D05 D06 D07 D08 D09 D10
E01 E02 E03 E04 E05 E06 E07 E08 E09 E10
F01 F02 F03 F04 F05 F06 F07 F08 F09 F10
G01 G02 G03 G04 G05 G06 G07 G08 G09 G10
H01 H02 H03 H04 H05 H06 H07 H08 H09 H10
Seat E05 reserved.
Okay, this seat is yours, one seat is $1
Sorry, this seat is sold out already.
範例為電影院的訂票系統
int lastRow = ‘A’ + (numRows-1);
The letter A is a unicode character U+0041 and its binäre representation is 01000001
When the theatre has 10 rows the calculation is lastRow = ‘A’ + (10–1) = ‘A’ + 9. In binäre the calculation is 01000001 (A) + 00001001 (9) = 01001010. This result is the binary code of the unicode U+004A which represents the letter J. Conclusion: the last row of the theatre is ‘J’ because first row is ‘A’ + nine rows leads to row ‘J’.
‘A’ = 65, ‘B’ = 66, ‘C’ = 67, ‘D’ = 68, ……
‘a’ = 97, ‘b’ = 98, ‘c’ = 99, ‘d’ = 100, ……
Theatre.java 改
import java.util.*;public class Theatre {
private final String theatreName;
// private List<Seat> seats = new ArrayList<>();
private Collection<Seat> seats = new LinkedList<>();
// private Collection<Seat> seats = new HashSet<>();
// private Collection<Seat> seats = new LinkedHashSet<>();
// private Collection<Seat> seats = new TreeSet<>(); // not work
public Theatre(String theatreName, int numRows, int seatsPerRow) {
this.theatreName = theatreName; int lastRow = 'A' + (numRows - 1);
for (char row = 'A'; row <= lastRow; row++) {
for (int seatNum = 1; seatNum <= seatsPerRow; seatNum++) {
Seat seat = new Seat(row + String.format("%02d", seatNum));
seats.add(seat);
}
}
} public String getTheatreName() {
return theatreName;
} public boolean reserveSeat(String seatNumber) {
Seat requestSeat = null;
for (Seat seat : seats) {
if (seat.getSeatNumber().equals(seatNumber)) {
requestSeat = seat;
break;
}
} if (requestSeat == null) {
System.out.println("There is no seat " + seatNumber);
return false;
} return requestSeat.reserve();
} // for testing
public void getSeats() {
for (Seat seat : seats) {
System.out.println(seat.getSeatNumber());
}
} private class Seat {
private final String seatNumber;
private boolean reserved = false; public Seat(String seatNumber) {
this.seatNumber = seatNumber;
} public boolean reserve() {
if (!reserved) {
reserved = true;
System.out.println("Seat " + seatNumber + " reserved.");
return true;
} else {
return false;
} } public boolean cancel() {
if (reserved) {
reserved = false;
System.out.println("Reservation of seat " + seatNumber + "cancelled");
return true;
} else {
return false;
} } public String getSeatNumber() {
return seatNumber;
}
}
}
輸出結果:
A01
A02
A03
A04
A05
A06
A07
A08
A09
A10
B01
B02
B03
B04
B05
B06
B07
B08
B09
B10
C01
C02
C03
C04
C05
C06
C07
C08
C09
C10
D01
D02
D03
D04
D05
D06
D07
D08
D09
D10
E01
E02
E03
E04
E05
E06
E07
E08
E09
E10
F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
G01
G02
G03
G04
G05
G06
G07
G08
G09
G10
H01
H02
H03
H04
H05
H06
H07
H08
H09
H10
Seat E05 reserved.
Okay, this seat is yours, one seat is $1
Sorry, this seat is sold out already.
改成 collection,並用繼承 collection 的,同級 4 個 List 來測試能否使用
結論是同級都能使用,但再往下級就不能