排序方法无法尝试对String ArrayList

时间:2017-10-05 15:55:35

标签: java loops sorting arraylist

我首先要说我的排序必须是硬编码的。我可能不会使用以前存在的排序函数。所以我写了这个:

for(int g = 0; g < priceArray.size(); g++)
{
    for(int h = 1; h < priceArray.size() - 1; h++)
    {
        int found = priceArray.get(h).indexOf('$', 8);

        if(Double.parseDouble(priceArray.get(h).substring(found+1)) > Double.parseDouble(priceArray.get(h+1).substring(found+1)))
        {
            String a = priceArray.get(h);
            String b = priceArray.get(h+1);

            priceArray.set(h,b);
            priceArray.set(h+1, a);
        }
    }
}

在代码的早期,此代码将输入放入ArrayList:

double oneD = daIS.readDouble();
int twoD = (int)daIS.readDouble();
double threeD = oneD * twoD;

String oneT = (String.format("$%.2f", oneD));
String twoT = (String.format("%s", twoD));
String threeT = (String.format("$%.2f", threeD));

priceArray.add(oneT + " x " + twoT + " = " + threeT);

基本上,这段代码获取输入,将其放入arraylist,然后sort方法在数组索引中搜索第二个$ money符号,并获取子字符串,以便在$符号后复制金额。解析它加倍并将其与下一个索引(h + 1)进行比较。

如果索引h大于索引h + 1,我们切换两个。循环继续前进。最后,在我没有发布的代码中,代码以排序的顺序显示在新窗口中。

示例:我在微调器中打开程序,输入5和输入3。如果我按保存,这些将保存在我的二进制文件中,然后转换回arraylist。我按了检索,我的输出是

$5.00 x 3 = $15.00

如果输入

,这完全正常
10 and 5(spinner)
20 and 2
50 and 1
30 and 4

作为输出

$20.00 x 2 = $40.00
$10.00 x 5 = $50.00
$50.00 x 1 = $50.00
$30.00 x 4 = $120.00

但如果我的输入是

10 x 1(spinner)
100 x 1
10 x 1

程序中断并返回

Exception in thread "JavaFX Application Thread"
java.lang.NumberFormatException: For input string: "$100.00"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)

我知道这很令人困惑,也许你质疑我的硬编码字符串排序的必要性,但遗憾的是这是一个要求。并且工作到一定程度,所以我相信它应该是可以修复的。谢谢你的阅读。

编辑:在@Nabin Bhandari的帮助下解决方案

int found1 = priceArray.get(h).lastIndexOf('$');
int found2 = priceArray.get(h+1).lastIndexOf('$');

if(Double.parseDouble(priceArray.get(h).substring(found1+1)) > Double.parseDouble(priceArray.get(h+1).substring(found2+1)))

1 个答案:

答案 0 :(得分:1)

在您的代码中:

int found = priceArray.get(h).indexOf('$', 8);

您对priceArray.get(h)priceArray.get(h+1)使用此值。

而不是你应该为两种不同的价格获得两个不同的指数。

for(int g = 0; g < priceArray.size(); g++)
{
    for(int h = 1; h < priceArray.size() - 1; h++)
    {
        int found1 = priceArray.get(h).lastIndexOf('$');
        int found2 = priceArray.get(h+1).lastIndexOf('$');

        String firstPrice = priceArray.get(h);
        String secondPrice = priceArray.get(h+1);

        String first = firstPrice.substring(found1+1);
        String second = secondPrice.substring(found2+1);

        if(Double.parseDouble(first) > Double.parseDouble(second))
        {
            String a = priceArray.get(h);
            String b = priceArray.get(h+1);

            priceArray.set(h,b);
            priceArray.set(h+1, a);
        }
    }
}

但上述代码似乎没有对价格进行排序。

所以,这是一种替代方式来对列表进行排序:

Collections.sort(priceArray, new Comparator<String>() {
    @Override
    public int compare(String p1, String p2) {
        String first = p1.substring(p1.lastIndexOf('$')+1);
        String second = p2.substring(p2.lastIndexOf('$')+1);
        System.out.println(first);
        System.out.println(second);
        return (int) (Double.parseDouble(first)-Double.parseDouble(second));
    }
});