java - 尝试对 String ArrayList 进行排序时,排序方法不起作用

标签 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);

基本上,这段代码获取输入,将其放入数组列表中,然后排序方法在数组索引中搜索第二个 $ 货币符号,并获取子字符串,以便复制 $ 符号后面的货币金额。将其解析为 double 并将其与下一个索引 (h+1) 进行比较。

如果索引 h 大于索引 h+1,我们将两者交换。并且循环继续进行。最终,在我没有发布的代码中,代码按排序顺序显示在新窗口中。

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

$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)))

最佳答案

在您的代码中:

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

关于java - 尝试对 String ArrayList 进行排序时,排序方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46590010/

相关文章:

java - 连接 Java - MySQL : Public Key Retrieval is not allowed

php - javascript中自动递增名称和ID

Python 列表用字符串排序

php - 如何通过 php/mysql 对我的日期进行排序?

java - 无法创建 CardView fragment

java - Xtend 运算符重载现有类

r - 相同维度的两个矩阵之间的 Spearman 相关性

c - 使用 GDB 更改 for 循环条件?

javascript - 如何按属性对数组进行分组并重新索引结果

java - 能够在没有权限的情况下删除文件