无法基于双重属性对对象进行排序

问题描述:

您好家伙我写了一个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性别身高类 图1f 1.6短 2米2.0高 3米1.85介质 4 F 1.9介质 5米1.7短 6 ˚F1.8介质 7 F 1.95介质 8 F 1.75介质 9米2.2高大 10米2.1高

阅读Javadoc on the Comparable interface。如果你不知道界面是什么,那就Google吧。

class Distance之后加implements Comparable

向班级中添加两种方法。一个是boolean compareTo(Distance d) {},遵循Javadoc中有关Comparable的说明。另一个将是boolean equals(Distance d) {}。所有你必须添加的是你的双重比较的逻辑。

现在,您的对象可以与>,<==进行比较。它们也可以按照他们以前不能做的方式进行排序和操作。

我会给你一个提示 - 你compareTo()逻辑是return this.distance.compareTo(d.distance);

+0

非常感谢你 –