在java中使用选择排序来对浮点数进行排序

时间:2010-05-06 03:10:16

标签: java sorting arraylist

嘿,我需要通过某个范围内的浮点字段对类别列表进行排序。这是我选择排序的代码: 基本上sortPrice将此列表中的内容复制到一个新的内容中,仅选择该范围内的值,然后在该数组列表中进行选择排序。 sortPrice中的arraylist(x)是未排序的,需要复制,因为x引用无法更改。

public ArrayList<House> sortPrice(ArrayList<House> x,float y, float z){
    ArrayList<House> xcopy = new ArrayList<House>();
    for(int i = 0; i<x.size(); i++){
        if(x.get(i).myPriceIsLessThanOrEqualTo(z) && x.get(i).myPriceIsGreaterThanOrEqualTo(y)){
            xcopy.add(x.get(i));
        }
    }

    ArrayList<House> price= new ArrayList<House>();
    while(xcopy.size()>0){
        House min = xcopy.get(0);
        for(int i = 1; i < xcopy.size();i++){
            House current = xcopy.get(i);
            if (current.myPriceIsGreaterThanOrEqualTo(min.getPrice())){
                min = current;
            }
        }
        price.add(min);
        xcopy.remove(min);
    }
    return price;
}

以下是家庭班的样子:

public class House {
private int numBedRs;
private int sqft;
private float numBathRs;
private float price;
private static int idNumOfMostRecentHouse = 0;
private int id;

public House(int bed,int ft, float bath, float price){
    sqft = ft;
    numBathRs = bath;
    numBedRs = bed;
    this.price = price;
    idNumOfMostRecentHouse++;
    id = idNumOfMostRecentHouse;
}



public boolean myPriceIsLessThanOrEqualTo(float y){
    if(Math.abs(price - y)<0.000001){
        return true;
    }
    return false;
}
public boolean myPriceIsGreaterThanOrEqualTo(float b){
    if(Math.abs(b-price)>0.0000001){
        return true;
    }
    return false;
}

当我打电话寻找范围在260000.50到300000之间的房子时,即使我的价值低于270000,我也只能获得最高价的房屋。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

你应该使用圆形双重类型。

DecimalFormat p= new DecimalFormat( "#0.00" );
double price = 123.00001;
price = new Double(p.format(price)).doubleValue();

答案 1 :(得分:0)

此问题的最佳数据结构是NavigableMap<Float,List<House>>(例如TreeMap),它支持subMap操作:

  

SortedMap<K,V> subMap(K fromKey, K toKey):返回此地图部分的视图,其范围从fromKey(包括{1}}到toKey,不包括。

还有一个重载允许您设置包含边界。

以下是演示:

    NavigableMap<Integer,String> nmap = new TreeMap<Integer,String>();
    nmap.put(5, "Five");
    nmap.put(1, "One");
    nmap.put(7, "Seven");
    nmap.put(3, "Three");

    System.out.println(nmap.subMap(2, 6));
    // prints {3=Three, 5=Five}

对于您的情况,您要制作House implements Comparable<House>,或定义自己的自定义Comparator<House>。然后,您可以让TreeMap为您进行排序,而不必处理选择排序(O(N^2)处于远离最佳状态)。


如果您坚持使用的规范,那么我建议将逻辑分解为这样的辅助方法:

List<House> filterInRange(List<House> houses, float low, float high) {
   List<House> ret = new ArrayList<House>();
   for (House h : houses) {
      if (isInRange(h.getPrice(), low, high)) {
         ret.add(h);
      }
   }
   return ret;
}

static boolean isInRange(float v, float low, float high) { ...DIY... }

void selectionSort(List<House> houses) { ...Wikipedia... }

然后,要在指定的价格范围内获得已排序的List<House>,请调用filterInRange,然后selectionSort返回的列表。

另见

答案 2 :(得分:0)

  1. 您的方法名称表示它对数据进行排序,该方法也会过滤。您需要更改名称。实际上,此代码中有许多变量需要更改其名称以更好地反映它们包含的内容。

  2. 您需要使用for-each循环替换for循环。这将简单地使代码更清晰。您也不再需要while()语句。

  3. 我还会将mypriceis ...方法重构为一个ispriceinrange方法。

  4. 或者,我会查看比较器接口,并将其作为一种对数据进行排序的方法,而无需手动编写循环代码。

  5. 刚看了一眼。你确实在第二个循环中进行排序,但是那些丑陋的代码可能无法正常启动。一定要看看comparator和Collections.sort()方法。拯救自己一个痛苦的世界。