在java中对arraylist进行排序,而不使用预定义的排序方法

时间:2015-05-10 09:58:09

标签: java sorting arraylist

我想按销售人员名称对arraylist进行排序,但我不允许使用内置排序。
在下面的代码中,我试图手动对它进行排序,但它在评论的行上显示错误(必需:找到的变量:value)。

    int j,k;
    boolean flag = true;  
    Salesperson person = new Salesperson(null, 0, 0);

    while (flag) {
        flag = false;
        for (j = 0, k=1; j < salesperson.size()-1; j++, k++) {
            if (salesperson.get(j).getName().compareToIgnoreCase(salesperson.get(j+1).getName()) > 0) {                                             // ascending sort

                person = salesperson.get(j);
             //   salesperson.get(j) = salesperson.get(k);     
             //   salesperson.get(k) = person;
                flag = true;
            }
        }
    }

3 个答案:

答案 0 :(得分:0)

你不能在一个循环中对数组进行排序,至少我所知道的,即使你在if语句中得到了正确的部分,算法仍然是错误的。您只在一次通过中将每个人与相邻人进行比较。

让我们假设您正在排序一系列看起来像这样的数字:

使用此算法

5 4 6 3 1 2,您将获得此结果4 5 3 1 2 6

就像你做的一样,它仍然没有排序,只有每个数字都与相邻的数字进行了比较。

关于设定值,请像Eran回答一样使用ArrayList.set()

Here are some sorting algorithms

答案 1 :(得分:0)

//salesperson.get(j) = salesperson.get(k);     
//   salesperson.get(k) = person;

您正在通过get()方法取出值。这不能用于分配值。这就是你得到编译错误的原因。

您应该做的是创建一个临时对象并将其分配给该对象并进行对象的交换 但是你必须重新检查你的排序迭代逻辑

答案 2 :(得分:0)

这是正确的代码。我在这些行中犯了错误

         //salesperson.get(j) = salesperson.get(k);     
         //   salesperson.get(k) = person;

这些被以下行替换,现在没有错误

                salesperson.set(j, salesperson.get(k));     
                salesperson.set(k, person);

感谢您的回答

    int j,k;
    boolean flag = true;  // will determine when the sort is finished
    Salesperson person = new Salesperson(null, 0, 0);

    while (flag) {
        flag = false;
        for (j = 0, k=1; j < salesperson.size()-1; j++, k++) {
            if (salesperson.get(j).getName().compareToIgnoreCase(salesperson.get(j+1).getName()) > 0) {                                             // ascending sort

                person = salesperson.get(j);
                salesperson.set(j, salesperson.get(k));     
                salesperson.set(k, person);
                flag = true;
            }
        }
    }