2014-02-21 2 views
0

Привет, ребята, я написал программу классификатора KNN, в которой мне приходится сортировать объекты на основе расстояния, которое является двойной переменной, но я не могу получить правильный результат. Вот мой код:Невозможно сортировать объекты на основе двойного атрибута

import java.util.*; 
import java.io.*; 

class Distance{ 
int index; 
double distance; 

public Distance(int index, double distance){ 
    this.index = index; 
    this.distance = distance; 
} 
} 

class KNN{ 

public static int getCount(){ 
    String file = "data2.txt"; 

    String line = null; 

    int i = 0; 

    try{ 
     FileReader fr = new FileReader(file); 
     BufferedReader br = new BufferedReader(fr); 
     while((line=br.readLine())!=null){ 
      i++; 
     } 
     br.close(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 
    i = i-1; 
    return i; 
} 

public static double[] setGenderValues(int k){ 
    double g[] = new double[k]; 
    String file = "data2.txt"; 
    String line = null; 
    int i = 0; 

    try{ 
     FileReader fr = new FileReader(file); 

     BufferedReader br = new BufferedReader(fr); 

     while((line=br.readLine())!=null){ 
      i++; 
      if(i == 1) 
      continue; 

      String colData[] = line.split(" "); 

      if(colData[1].equals("f")){ 
       g[i-2] = 1; 
      } 
      else if(colData[1].equals("m")){ 
       g[i-2] = 0; 
      } 
     } 

     br.close(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 
    return g; 
} 

public static double getMinHeight(double h[]){ 
    double min = h[0]; 
    for(int i = 1; i<h.length; i++){ 
     if(h[i] < min){ 
      min = h[i]; 
     } 
    } 
    return min; 

} 

public static double getMaxHeight(double h[]){ 
    double max = h[0]; 
    for(int i = 1; i<h.length; i++){ 
     if(h[i] > max){ 
      max = h[i]; 
     } 
    } 
    return max; 
} 

public static double[] setHeightValues(int k){ 
    String file = "data2.txt"; 
    double h[] = new double[k]; 
    String line = null; 
    int i = 0; 

    try{ 
     FileReader fr = new FileReader(file); 

     BufferedReader br = new BufferedReader(fr); 

     while((line=br.readLine())!=null){ 
      i++; 
      if(i == 1) 
      continue; 
      String colData[] = line.split(" "); 
      h[i-2] = Double.parseDouble(colData[2]); 

     } 


     br.close(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 

    return h; 
} 

public static double[] setClassValues(int k){ 
    String file = "data2.txt"; 

    String line = null; 
    double c[] = new double[k]; 
    int i = 0; 

    try{ 
     FileReader fr = new FileReader(file); 

     BufferedReader br = new BufferedReader(fr); 

     while((line=br.readLine())!=null){ 
      i++; 
      if(i == 1) 
      continue; 
      String colData[] = line.split(" "); 

      if(colData[3].equals("tall")){ 
       c[i-2] = 3; 
      } 
      else if(colData[3].equals("medium")){ 
       c[i-2] = 2; 
      } 
      else if(colData[3].equals("short")){ 
       c[i-2] = 1; 
      } 
     } 


     br.close(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 
    return c; 
} 

public static void main(String args[]){ 
    Scanner scan = new Scanner(System.in); 
    double u[] = new double[2]; 
    System.out.println("Enter gender; 1 for female, 0 for male"); 
    u[0] = scan.nextDouble(); 
    System.out.println("Enter height:"); 
    u[1] = scan.nextDouble(); 

    int k = getCount(); 

    //now, we normalize gender 
    double g[] = setGenderValues(k); 

    double h[] = setHeightValues(k); 

    double vmin = getMinHeight(h); 
    double vmax = getMaxHeight(h); 

    //now, we normalize height 
    for(int i = 0; i < k; i++){ 
     h[i] = (h[i] - vmin)/(vmax - vmin); 
    } 
    u[1] = (u[1] - vmin)/(vmax - vmin); 

    //now, we set class values 
    double c[] = setClassValues(k); 

    /*System.out.println("gender height class"); 
    for(int i = 0;i< 10; i++){ 
     System.out.println(g[i]+" "+h[i]+" "+c[i]); 
    }*/ 

    int n = (int)Math.sqrt(k); 

    Distance d[] = new Distance[k]; 

    for(int i=0; i<k; i++){ 
     double distance = (u[0]-g[i])*(u[0]-g[i]) + (u[1]-h[i])*(u[1]-h[i]); 
     distance = Math.sqrt(distance); 
     d[i] = new Distance(i , distance); 
    } 

    for(int i =0; i<d.length; i++){ 
     System.out.println(d[i].index + " " + d[i].distance); 
    } 

    Distance temp; 
    for(int i=0; i<k-1; i++){ 
     for(int j=0; j<k-1; j++){ 
      if(d[j].distance > d[j+1].distance){ 
       temp = d[j]; 
       d[j] = d[j+1]; 
       d[j+1] = d[j]; 
      } 
     } 

    } 

    int count_tall = 0, count_short = 0, count_medium = 0; 
    System.out.println("sorted:"); 
    for(int i =0; i<d.length; i++){ 
     System.out.println(d[i].index + " " + d[i].distance); 
    } 
} 
} 

Вот мой текстовый файл: person_id класс пола высоты 1 е 1,6 короткого 2 м 2,0 высота 3 м 1,85 среда 4 е 1,9 средой 5 м 1,7 короткие 6 е 1.8 среды -F 1,95 среды -F 1,75 средней 9 м 2,2 высота 10 м в высоту 2,1

ответ

0

прочитать Javadoc on the Comparable interface. Если вы не знаете, что такое интерфейс, Google это.

После class Distance добавить implements Comparable.

Добавьте два метода в свой класс. Один будет boolean compareTo(Distance d) {}, который следует инструкциям в Javadoc для Comparable. Другой будет boolean equals(Distance d) {}. Все, что вам нужно добавить, это логика сравнения вашего двойника.

Теперь, ваши объекты можно сравнить с >, < и ==. Они также могут быть отсортированы и обработаны классом Collections способами, которые они раньше не могли.

Я дам вам подсказку - логику для вашего compareTo() является return this.distance.compareTo(d.distance);

+0

большое спасибо –

Смежные вопросы