CompareTo, как исправить ошибку

TiPSY

Здравствуйте, столкнулся с такой проблемой, что compareTo закидывает самую первую строчку из файла в конец после сортировки. Так выглядит код

count=0;
    for(int j=0;j<r.size();j++) {="" count++;="" for(int="" i="r.size()-1;i">j;i--) {
            if(r.get(i).Name.compareTo(r.get(i-1).Name)<0) {
                Collections.swap(r, i, i-1);
            }
        }
    }
</r.size();j++)>

Вот данные которые читаются из файла:

  • Black Den Alex Pon Sofia Delta Maria

Вот что компилятор выдает

  • Alex Delta Den Maria Pon Sofia Black (Black должно идти после Alex, в сравнение делает так с каждым первым элементом)

Добавляю класс r

class Room {
String Name;
String Surname;
String RoomS;
int RoomN;
int RoomQ;
float cost;





Room(String Name,String Surname,String RoomS,int RoomN,int RoomQ,float cost) {
    this.Name=Name;
    this.Surname=Surname;
    this.RoomS=RoomS;
    this.RoomN=RoomN;
    this.RoomQ=RoomQ;
    this.cost=cost;

}

public String getName() {
    return Name;
}

}

А так же считывания файла

public static void ShowFile() throws IOException{
    if(check) {
        count=0;
        String tmp;
        String str[];
        try(BufferedReader fin = new BufferedReader(new FileReader("Rooms.txt"))){
            tmp=fin.readLine();
            while(tmp!=null) {
                str=tmp.split(" ");

                int r1=Integer.parseInt(str[3]);
                int r2=Integer.parseInt(str[4]);
                float r3=Float.parseFloat(str[5]);

                r.add(new Room(str[0],str[1],str[2],r1,r2,r3));

                count++;
                tmp=fin.readLine(); 
            }
            check=false;

        }catch(IOException e) {
            System.out.println("Error I/O" + e);
        }
    }
}

Данные в txt файле

Jack Sparow Busy 1 3 100 
Daniel BlackBeard Busy 2 3 100 
Adolf Ruzveld Busy 3 4 100 
Pētersone Ilze Busy 4 8 100 
Liepa Māra Busy 5 3 100 
No Info Free 6 4 101 
No Info Free 7 6 102
1 ответ

TiPSY

Предполагаю, что проблема связана с кодировкой, а конкретно с BOM. Это невидимый символ, который некоторые текстовые редакторы вставляют в начале файла.

Для проверки можете попробовать сразу после считывания вывести первую букву имени первой комнаты:

char firstLetter = r.get(0).Name.charAt(0);
 System.out.println("First letter of the first room: \""+ firstLetter + "\"("+ ((int) firstLetter)+")");

Если вместо первой буквы выводится ""(65279) то это BOM.

Попробуйте следующие решения проблемы:

  • Откройте файл Rooms.txt в текстовом редакторе и попробуйте установить кодировку UTF-8 без BOM. Многие редакторы (например, Notepad++) поддерживают такую возможность.

  • Удаляйте символ сразу после чтения. Например, так:

    while(tmp!=null) {
        tmp = tmp.replace("\uFEFF", "");
        ...

licensed under cc by-sa 3.0 with attribution.