我需要帮助处理我的java程序中的数组。在我的第一堂课“测试”中,我设置了4个变量然后将它们发送到我的其他类(test2)。
arr[i] = new test2(id, fname, lname, case);
此时,变量已设置,然后我想返回这些变量。所以在test2类中,我有一个严格返回其中一个变量的方法
public int getId(){
return id;
}
我明白这有点愚蠢,但教授得到教授想要的东西。我现在要做的是在我的主要方法“test”中我想要检索该变量并根据该int对数组进行排序。不幸的是,我必须创建自己的排序功能,但我认为这对我想做的事情有用。
for(j = 0; j < arr.length; j++){
int indexMin =j;
for(i = j; i < arr.length;i++){
if(arr[i] < arr[indexMin]){
indexMin = i;
}
}
int tmp = arr[j];
arr[j] = arr[indexMin];
arr[indexMin] = tmp;
}
我感谢任何人都能提供的任何帮助。 谢谢
答案 0 :(得分:2)
所以有一些评论:
- 你的循环看起来像这样:
for(i = j; i < arr.length; i++)
你应该宣布
for(int i = j; i< arr.length; i++);
要么你还没有声明我,这会给你一个编译错误,或者你之前声明我不理想...你通过尽可能在本地声明变量来避免错误。
- 在这一行中你直接比较对象:
if(arr[i] < arr[indexMin]){
但如果我理解你的意图,你想比较ID,所以这应该是
if(arr[i].getId() < arr[indexMin].getId()){
- 看起来arr是一个test2对象的数组,但你为交换代码分配了一个int:
int tmp = arr[j];
这应该是
test2 tmp = arr[j];
就您的算法而言,为什么不启动并运行代码,然后尝试使用一些结果进行测试。 ID为1,2,3和4的4个对象怎么办? 4,3,2和1怎么样?如果我在这里告诉你一个算法,你会通过手动玩它来学到更多。不要害怕添加一些声明,以帮助您确切了解发生了什么。例如,也许您可能会将最后4行更改为:
System.out.println("About to swap id " + arr[j].getId() + " from index " + j + " with minimum " + arr[indexMin].getId() + " at index " + indexMin);
test2 tmp = arr[j];
arr[j] = arr[indexMin];
arr[indexMin] = tmp;
这将帮助您更快地了解在您的计划中发生的事情,并且不要害怕添加更多类似的东西。
答案 1 :(得分:0)
制作Test2 implements Comparable<Test2>
并改为使用java.util.Arrays.sort(Object[])
。
compareTo(Test2)
看起来像这样:
@Override int public compareTo(Test2 other) {
return
(this.id < other.id) ? -1 :
(this.id > other.id) ? +1 :
0;
}
更好的是,如果您可以切换到List<Test2>
( Effective Java 2nd Edition:第25项:首选列表到数组)。
this.id - other.id
。这种逐个减法的技巧被打破了。如果您必须实施自己的排序,则需要arr[i] < arr[indexMin]
代替arr[i].getId() < arr[indexMin].getId()
。这假设它被声明为Test2[] arr;
如果出于某种原因将其声明为Object[] arr
,那么您只需要将它们转换为Test2
,然后才能调用getId()
。
((Test2) arr[i]).getId() < ((Test2) arr[indexMin]).getId()
您还想为交换声明Test2 tmp
而不是int tmp
。
对于打印,您可以使用for-each循环:
for (Test2 t : arr) {
System.out.println(t);
}
这假定Test2
具有对打印敏感的@Override
public String toString()
,但您可以单独访问成员方法。