Мне нужна помощь, чтобы правильно реализовать Comparable интерфейс - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть встроенный класс Melody, который читает следующие строки из файла и сохраняет их в массиве с именем notes типа Note.Столбцы: время в 1/100 секунды, номер ноты, скорость, длина.

0 60 100 24
25 72 100 24
100 60 100 24
50 60 100 24
75 72 100 24

Для моей курсовой работы мне нужно реализовать интерфейс Comparable.Мне нужно сделать свой класс заметок сопоставимым, чтобы заметки упорядочивались по времени, и если две заметки появляются одновременно, мне нужно сначала поставить заметку с меньшим номером.Мне нужна помощь, потому что я застрял, пытаясь правильно реализовать метод сравнения и распечатать результат.Буду признателен за любую помощь, заранее спасибо.

Это мой класс Note

public class Note implements Comparable <Note> {  

    private int time;
    private int noteNumber;
    private int velocity;
    private int length;

    public Note (int time,int noteNumber,int velocity,int lenght){

        this.time = time;
        this.noteNumber = noteNumber;
        this.velocity = velocity;
        this.length = lenght;  
    }

    public String toString()
    {

        String s =  time +" "+ noteNumber + " " + velocity + " " + length;

        return s;   
    } 

    @Override
    public int compareTo(Note o) {

        return Integer.compare(time, o.time);
    }
} 

Это мой класс Melody

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Melody  {

    Note [] notes = new Note[5];

    public Melody() throws IOException{

        FileReader fr = new FileReader ("/Users/enricomomo/Desktop/Text/file2.txt");
        BufferedReader br = new BufferedReader (fr); //Info stored into a buffer

        String line = br.readLine(); //Lines are read from the buffer and stored into a variable

        int lineCounter = 0;

        while  ( line != null )//When reached the end of the file the while loop stops 

        { 

            StringTokenizer st = new StringTokenizer(line, " ");

            int time = Integer.parseInt(st.nextToken());
            int noteNumber = Integer.parseInt(st.nextToken());
            int velocity = Integer.parseInt(st.nextToken());
            int length = Integer.parseInt(st.nextToken());

            System.out.println(line + " " + lineCounter);

            Note n = new Note(time,noteNumber,velocity,length);

            notes[lineCounter] = n;

            line = br.readLine();

            lineCounter ++;
        }

        br.close(); 
    }

    public void contet(){

        for ( int i = 0; i < notes.length; i ++)
        {

            System.out.println(notes[i]);                    
        }
    }

    public String toString()
    {
         String rtn = "";

         //Code to create a String version of the object 

         for ( int i = 0; i < notes.length; i ++)
            {

                rtn += "\n"; 
            }

         return rtn; 
    }
}    

И это мой тестовый класс

import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException {

        Melody m = new Melody();

        System.out.print(m);

        m.contet();
    } 
}

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Попробуйте это:

public class Note implements Comparable <Note>
{
  ...

  @Override
  public int compareTo(Note o)
  {
    int result;
    result = time - o.time;
    if (result == 0)
      result = noteNumber - o.noteNumber;
    if (result == 0)
      result = velocity - o.velocity;
    return (result);
  }  
}

После этого вам нужно отсортировать массив:

public Melody() throws IOException
{
  ...

  Arrays.sort(notes);

}
0 голосов
/ 17 декабря 2018

Поскольку time и noteNumber равны int:

@Override
public int compareTo(Note o) {
    if (time == o.time)
        return Integer.compare(noteNumber, o.noteNumber);
    else
        return Integer.compare(time, o.time);
}

compareTo необходимо вернуть отрицательное, нулевое или положительное число,в зависимости от того, меньше ли 1-й предмет, равен или больше 2-го.После заполнения массива Note объектов вызовем:

Arrays.sort(notes);
...