【问题标题】:Date register sorting algorithm日期寄存器排序算法
【发布时间】:2014-12-02 18:42:22
【问题描述】:

我创建了一个用作生日登记的程序,您可以在其中将日期(姓名、日期)输入到 ArrayList 中,然后我可以在对话框窗口中将它们打印出来。但是,我想按日期编号对它们进行排序,然后将其打印出来。我试过这个,但我卡住了,希望能得到一些支持。

这是我到目前为止编写的代码,它不起作用。我在网上找到了该算法作为伪代码。

public String sortDate(){ // 

            StringBuilder sb = new StringBuilder();
            boolean[]help = new boolean[reg.size()];

            for(int i = 0; i<reg.size()-1;i++){
                    int min= Integer.MAX_VALUE;
                    int minIndex = -1;
                    for(int k = i; k<reg.size()-1; k++){
                            if(help[k]=false && Integer.parseInt(reg.get(k).getDate())< min){
                                    minIndex = k;
                                    min = reg.get(k).getDateInt();

                            }


                    }

                    sb.append(reg.get(minIndex).getDate()+"\n");
                    help[minIndex] = true;
            }
            return sb.toString();
}

我最终得到了错误的输出。我得到数组中第一个日期的值乘以数组的大小。可以说,如果我的数组中有 3 个日期并且第一个值是 (890105),那么输出会给我:

890105
890105
890105

我找到的伪代码是:

create something that stores the search result (ex. StringBuilder object)
create a boolean array (where all elements are false by start)
for i = 0 to size-1:
    m = big value
    for k = 0 to size-1:
        if help[k] is false and the value on spot k < min:
            index = k;
            m = value on spot k;
add m at the end of the search result
help[index] = true;

感谢我能得到的任何帮助

【问题讨论】:

  • 提示:Integer.MAX_VALUE2147483647。你正在做reg.get(min),一开始你将min初始化为Integer.MAX_VALUE。你能看到你有时在做reg.get(min)min 有这个值吗?
  • 什么是reg?使用Collestion.sort(List)Collections.sort(List, Comparator)
  • reg (register) 是存储所有名称和日期的 ArrayList。我也想尝试自己编写算法以用于教育目的,因此不使用集合排序
  • 可能问题在这里:sb.append(reg.get(min).getDate()+"\n");,应该是:sb.append(reg.get(minIndex)。 getDate()+"\n");

标签: java algorithm arraylist


【解决方案1】:

这是一个错误:

if(help[k]=false && ...

您在此处分配falsehelp[k]if (...) 中的整个表达式的计算结果为 false。所以,if 的主体没有被执行,min 停留在Integer.MAX_VALUE 然后你执行reg.get(min),导致你看到的异常。

你的意思是:

// Note: == instead of =
if (help[k] == false && ...

或更好:

if (!help[k] && ...

【讨论】:

  • 就是这样!谢谢,我不敢相信我错过了。
【解决方案2】:
//first:
int min= Integer.MAX_VALUE;
//later...
reg.get(min)

你觉得这里有问题吗?

【讨论】:

  • 但它也将 min 作为 reg.get(k).getDateInt() 放入 for/if 循环中
【解决方案3】:

看起来应该是:

sb.append(reg.get(minIndex).getDate()+"\n");

【讨论】:

  • 谢谢,它解决了编译错误。但是,我得到了错误的输出。我得到数组中第一个日期的值乘以数组的大小。可以说,如果我的数组中有 3 个日期并且第一个值为 (890105),那么输出给我:890105、890105、890105
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多