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

210
30 марта 2018, 12:58

Здравствуйте, столкнулся с такой проблемой, что 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);
            }
        }
    }

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

  • 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 
Answer 1

Предполагаю, что проблема связана с кодировкой, а конкретно с 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", "");
        ...
    
READ ALSO
Вопрос по ООП. Конкретный пример

Вопрос по ООП. Конкретный пример

Класс - реализация интерфейса, описывающего работникаУ каждого работника может быть менеджер, у каждого менеджера может быть менеджер итд

172
Проектирование и многопоточность Java

Проектирование и многопоточность Java

Существует кусками реализованная структура проектаБез многопоточности

254
GridView in LinearLayout

GridView in LinearLayout

Можно ли использовать gridview в linearlayout/ Ставлю, вроде отображает,а содержимого нету!

203
JSP Поле с нижним подчеркиванием

JSP Поле с нижним подчеркиванием

JSP ругается на поле с нижним подчеркиванием, но информации о том, что так делать нельзя, я не нашел

185