输出错误数据的双精度值的排序

时间:2014-10-15 05:21:36

标签: java sorting selection

我在大学课程中遇到了一些问题。我也失去了作业的最后一部分,我认为简单的部分很快就变得最难。我被要求按距离对.cvs文件中的值进行排序(17.0123874627346,0.123761947之类的值等)

这是我的代码:

public void sortDistance() {
    System.out.println("before distance sort");
    for (int k = 0; k < ntracks; k++) {
        System.out.println(tracks[k].getDistance());
    }
    for (int i = 0; i < ntracks; i++) {
        //find the index of the minimum position
        int index = i;
        //looping through array of distances
        for (int j = i + 1; j < ntracks; j++) {
            if  (tracks[index].getDistance() < tracks[j].getDistance())             
            {
                //position j is new mimum index
                index = j;
            }
        }
        //swap the two values around so smallest becomes track index
        Track smallerTrack  = tracks[index]; 
        tracks[index] = tracks[i]; 
        tracks[i] = smallerTrack;
    }
    System.out.println(" after distnace sort");
    for (int k = 0; k < ntracks; k++) {
        System.out.println(tracks[k].getDistance());
    }
}

3 个答案:

答案 0 :(得分:1)

Float s [] = {1,3,2}; Arrays.sort(一个或多个);

答案 1 :(得分:0)

我认为没有必要实现自己的逻辑排序,你可以使用提供的方法..

Arrays.sort(tracks);

System.out.print(Arrays.toString(tracks));

Source Doc

Source Doc

答案 2 :(得分:0)

<强> TL:DR;

  • 将BigDecimal用于高精度浮点数
  • 使用Comparable和Collections.sort()进行排序

完整答案

看起来你的课程看起来有点像这样:

public class Track
    private float distance;
    public Track(float distance) {
        this.distance = distance;
    }
    public float getDistance() {
        return this.distance;
    }
}

如果是这种情况,那么我很想改变它并与BigDecimal一起工作。 BigDecimal是一个对象,设计用于在需要高精度时使用十进制数。由于您的一个样本距离有13个小数位,我将直接前往BigDecimal

所以我改变它看起来像这样:

public class Track
    private BigDecimal distance;
    public Track(String distance) {
        this.distance = new BigDecimal(distance);
    }
    public BigDecimal getDistance() {
        return this.distance;
    }
}

从这里开始,您可以依赖BigDecimal实现Comparable接口的事实,因此它具有compareTo方法。因此,您可以为跟踪实施Comparable,然后delegateBigDecimal上的compareTo方法实施。像这样:

public class Track implements Comparable<Track> //Note we now implement an interface
    private float distance;
    public Track(float distance) {
        this.distance = distance;
    }
    public float getDistance() {
        return this.distance;
    }
    public int compareTo(Track track) { //And our implementation just delegates to the BigDecimal compareTo method
        return this.distance.compareTo(track.getDistance());
    }
}

一旦你有了这个,你的分类变得非常容易!您可以替换所有距离检查(因为compareTo BigDecimal正在为您执行此操作)并且只需在Track对象列表上调用Collections.sort()。像这样的东西会起作用:

public void sortDistance() {
    System.out.println("before distance sort");
    for (int k = 0; k < ntracks; k++) {
        System.out.println(tracks[k].getDistance());
    }

    List<Track> tracksList = Arrays.asList(tracks); //Convert to a list to use the Collections API
    Collections.sort(trackList);

    System.out.println(" after distnace sort");
    for (int k = 0; k < ntracks; k++) {
        System.out.println(tracksList.get(k).getDistance());
    }
}

我刚刚结束时说我没有运行任何此类代码,因此可能无法编译。

另外,这里有一些我已经提到的一些文件,以防他们提出新概念: