#java
#java
Вопрос:
В моем университете мы регулярно получаем задания по программированию, которые (по крайней мере, на данный момент) обычно касаются консольного программирования. Когда я создаю свои программы в Netbeans и оттуда компилирую и запускаю, все работает так, как ожидалось… Однако при ручной компиляции с использованием javac filename.java и при запуске с использованием java filename я получаю ошибки форматирования wierd при распечатке строк… (System.out.println и System.out.printf)
Возьмите это в качестве примера. Я распечатываю содержимое таблицы, которая при запуске в Netbeans выглядит следующим образом:
Hybel Leietager Saldo
--------------------------
1A Ole Johan 6000
1B Erik Smith 12000
1C TOM HYBEL 0
1D Alan Turen 9000
1E Tim Verner 33000
1F Anders Tanen 4999
2A Torvald Linus 9000
2B Rikard Stall 5001
2C Bill Weitz 10000
2D Steve Job 15000
2E Steve Woz 123
2F Denis Rich 2400
3A James Goblin 88000
3B Mark Sukker 456000
3C Karl Bagasje 6000
3D TOM HYBEL 0
3E Ada Love 250
3F Don Knut 55000
Periode: 9/2011
Total fortjeneste: 1400500
Однако при ручной компиляции и запуске я получаю это:
Hybel Leietager Saldo
--------------------------
6000 Johan
12000k Smith
0TOM HYBEL
9000an Turen
33000 Verner
4999Anders Tanen
9000 Torvald Linus
5001Rikard Stall
10000l Weitz
15000e Job
123eve Woz
2400nis Rich
88000ames Goblin
456000k Sukker
6000Karl Bagasje
0TOM HYBEL
250 Love
55000nut
Periode: 9/2011
Total fortjeneste: 1400500
Я не понимаю, функция, выводящая это, представляет собой простой цикл for с System.out.println или printf… Кто-нибудь понимает, почему это происходит?
Вот код, немного сложный для понимания, поскольку он написан на норвежском (я знаю, плохая практика, все это должно быть на английском… но мы обязаны делать это в классе, плохие учителя, ПЛОХИЕ!)
В принципе, lengdenAvLengsteNavn() находит самое длинное имя (указано в разделе «Leietager»). Genereroversiktop() создает строку заголовка с требуемым интервалом (в зависимости от самого длинного имени). Строка заголовка — это то, что гласит «Hybel Leietager …..Saldo». horizontalSkille() выводит разделитель по горизонтали («———….»), и hybelOversiktLinje () фактически печатает строку, представляющую hybel (кондо), с правильным интервалом… Как вы можете видеть, табуляции или / r не используются…
private void skrivOversikt () {
System.out.println("*** Hybel Oversikt *** n");
String oversiktTop = genererOversiktTop();
System.out.println(oversiktTop);
System.out.println(horizontalSkille (oversiktTop.length()));
for(int i = 0; i < etasjer.length; i ) {
Etasje etasje = etasjer[i];
for(int j = 0; j < etasje.hybler().length; j ) {
Hybel hybel = etasje.hybler()[j];
System.out.print(hybelOversiktsLinje (oversiktTop, hybel) "n");
}
}
System.out.println();
System.out.println("Periode: " innevaerendeMaaned "/" innevaerendeAar);
System.out.println("Total fortjeneste: " totalFortjeneste);
} //Skriver ut en oversikt over alle hybler, leietagere og deres saldo
private String genererOversiktTop () {
String oversiktsTop = "Hybel Leietager";
int leietagerSaldoSkille = lengdenAvLengsteNavn() - "Leietager".length();
for (int i = 0; i < leietagerSaldoSkille; i ) {
oversiktsTop = " ";
}
return oversiktsTop " Saldo";
}
private String horizontalSkille (int lengde) {
String skille = "";
for (int i = 0; i < lengde; i ) {
skille = "-";
}
return skille;
}
private String hybelOversiktsLinje (String oversiktsTop, Hybel hybel) {
int leietagerIndex = oversiktsTop.indexOf("Leietager");
int saldoIndex = oversiktsTop.indexOf("Saldo");
String linje = hybel.romNavn();
while (linje.length() < leietagerIndex) {
linje = " ";
}
linje = hybel.leietagerNavn();
while (linje.length() < saldoIndex) {
linje = " ";
}
return linje hybel.saldo();
}
private int lengdenAvLengsteNavn () {
int lengsteLengde = 0;
for (int i = 0; i < etasjer.length; i ) {
for (int j = 0; j < etasjer[i].hybler().length; j ) {
Hybel hybel = etasjer[i].hybler()[j];
if (hybel.leietagerNavn().length() > lengsteLengde)
lengsteLengde = hybel.leietagerNavn().length();
}
}
return lengsteLengde;
}
Комментарии:
1. Вы должны добавить свои операторы println и printf, чтобы мы могли видеть, что пошло не так. Я подозреваю, что используется неправильный символ табуляции.
Ответ №1:
Вы печатаете 'r'
символ после имени. Этот символ интерпретируется по-разному на этих двух терминалах.
Комментарии:
1. @RobinHeggelundHansen возможно, это уже включено в
hybel.leietagerNavn()
строку.
Ответ №2:
Я думаю, потому что выходные консоли разные. Каждый из них обрабатывает специальные символы, такие как табуляция, по-разному.