Эй, дело глубже, чем можно подумать. Я всегда находил эти циклы над примерами персонажей мерзкими, я получил это на моем последнем собеседованииИтак, мы идем:
Если упражнение будет таким: строки, полученные из 1..n, столбцы для 1..n, выходные данные должны быть "1/1, 1/2 ... 3 /1, 3/2 ... ", это было бы прямо, не так ли?
public void seatnumbersNumbersOnly() {
int numRows = 3;
int numColumns = 3;
for (int currentRow = 1; currentRow <= numRows; currentRow++) {
for (int currentColumn = 1; currentColumn < numColumns; currentColumn++) {
System.out.print(currentColumn + "/" + currentRow + " ");
}
}
}
Но задача другая, им нужны буквы для столбцов. Давайте грубо форсировать его на той же основе.
public void seatnumbersNumbersMappedAgain() {
String[] seatLetters = new String []{"A", "B", "C"}; // so many letters as there are columns. Note: array index is 0-based
int numRows = 3;
int numColumns = 3;
for (int currentRow = 1; currentRow <= numRows; currentRow++) {
for (int currentColumn = 1; currentColumn < numColumns; currentColumn++) {
// seatLetters[i] is a string "s", not a char 'c', so everything's fine
System.out.print(seatLetters[currentColumn - 1] + currentRow + " "); // -1: seatLetters indexing is zero based
}
}
}
Но тогда: в Java символы и байты взаимозаменяемы, пока вы находитесь в диапазоне ascii, вы можете назначитьсимвол, буквальный для байта, и наоборот.
@Test
public void charByteEquivalence() {
// check out http://www.asciitable.com/
char ca = 'A';
byte ba = 0x41;
assertEquals(ca, ba);
ca = 0x41;
ba = 'A';
assertEquals(ca, ba);
}
Это означает, что вы также можете использовать переменную char непосредственно для зацикливания. Но будьте осторожны, сборка выходной строки становится беспорядочной, так как вам нужно следить за тем, что получает "+", с чем. Требуются значения String / char для столбцов и числа для строк. A "string" + char/byte/int
... становится строкой. char + int
становится и int? байт? символ? Просто, конечно, не строка. Раскрытие: Я пробовал и ошибался конкатенацию строк, и она становится int. Некоторые примеры неявных преобразований типов: здесь , официальная ссылка здесь .
public void seatnumbersChar() {
int numRows = 3;
int numColumns = 3;
char firstColumnLetter = 'A';
for (int currentRow = 1; currentRow <= numRows; currentRow++) {
for (char currentColumn = firstColumnLetter; currentColumn < firstColumnLetter + numColumns; currentColumn++) {
// at this point you have to watch out currentColumn + currentRow + " " will get evaluated left to right
// currentRow is an int
// currentColumn becomes an int when "+"ed with currentRow
// so currentRow + currentColumn would add two numbers instead of concatenating 2 strings, therefore
// an explicit conversion to string is needed for one of the arguments
System.out.print(currentColumn + String.valueOf(currentRow) + " ");
}
}
}
Тот же пример прохождения байтового маршрута, похожий беспорядок с конкатенацией строк,но не совсем то же самое.
public void seatnumbersByte() {
int numRows = 3;
int numColumns = 3;
byte firstColumnLetter = 'A';
for (int currentRow = 1; currentRow <= numRows; currentRow++) {
for (byte currentColumn = firstColumnLetter; currentColumn < firstColumnLetter + numColumns; currentColumn++) {
// same case other trick: (currentRow + " ") forces the result to be a string due to the + " "
// currentColumn here is declared as byte, when concatenated to a string the numeric representation would be taken (wtf...?)
// therefore a cast to char is needed "(char) currentColumn"
// what's left now ? (currentRow + " ") is a string
// "(char) currentColumn" is a char
// a char "+" a string is a string
System.out.print((char) currentColumn + (currentRow + " "));
}
}
}
Надеюсь, я отомстил за последнее интервью. Все равно получили работу;)