【问题标题】:Sort of double values outputting wrong data输出错误数据的双精度值排序
【发布时间】:2014-10-15 14:01:04
【问题描述】:

我在大学课程方面遇到了一些问题。我也完成了作业的最后一部分,我认为容易的部分很快就变成了最难的部分。我被要求按距离对 .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());
    }
}

【问题讨论】:

    标签: java sorting selection


    【解决方案1】:

    浮点 s[]={1,3,2}; Arrays.sort(s);

    【讨论】:

    • 在java中有内置的方法可以用于排序。 Java.util.Arrays。它可以对原始类型数据进行排序。有关详细信息,请参阅 oracle 文档。
    【解决方案2】:

    我觉得排序不需要自己实现逻辑,可以使用提供的方法..

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

    Source Doc

    Source Doc

    【讨论】:

      【解决方案3】:

      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方法。因此,您可以为 Track 实现 Comparable,然后只为 BigDecimal 上的 compareTo 方法实现 delegate。像这样:

      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());
          }
      }
      

      一旦你有了它,你的分类就变得超级简单!您可以替换所有对距离的检查(因为BigDecimal 上的compareTo 正在为您执行此操作),只需在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());
          }
      }
      

      最后我会说我没有运行任何这段代码,所以它可能无法编译。

      此外,如果它们是新概念,以下是我提到的一些内容的一些文档:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-09
        • 2019-06-25
        • 1970-01-01
        • 2013-01-11
        • 2014-09-06
        • 2013-07-13
        • 1970-01-01
        • 2016-07-28
        相关资源
        最近更新 更多