嘿,我需要通过某个范围内的浮点字段对类别列表进行排序。这是我选择排序的代码: 基本上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,我也只能获得最高价的房屋。有人可以帮忙吗?
答案 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)
您的方法名称表示它对数据进行排序,该方法也会过滤。您需要更改名称。实际上,此代码中有许多变量需要更改其名称以更好地反映它们包含的内容。
您需要使用for-each循环替换for循环。这将简单地使代码更清晰。您也不再需要while()语句。
我还会将mypriceis ...方法重构为一个ispriceinrange方法。
或者,我会查看比较器接口,并将其作为一种对数据进行排序的方法,而无需手动编写循环代码。
刚看了一眼。你确实在第二个循环中进行排序,但是那些丑陋的代码可能无法正常启动。一定要看看comparator和Collections.sort()方法。拯救自己一个痛苦的世界。