【问题标题】:Calling arrays from other methods in a different class从不同类中的其他方法调用数组
【发布时间】:2026-01-07 17:55:02
【问题描述】:

我需要帮助处理我的 java 程序中的数组。在我的第一堂课“test”中,我设置了 4 个变量,然后将它们发送到我的另一个类(test2)。

arr[i] = new test2(id, fname, lname, case);

此时,变量已设置,然后我想返回这些变量。所以在 test2 类中,我有一个严格返回其中一个变量的方法

public int getId(){
return id;
}

我知道这有点愚蠢,但我猜教授得到了教授想要的。我现在要做的是在“测试”中的主要方法中,我想检索该变量并根据该 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;
  }

感谢任何人提供的任何帮助。 谢谢

【问题讨论】:

  • 抱歉,如果不清楚。我不知道如何从 test2 类中的方法调用返回值。如果有人告诉我如何打印以筛选数组中的所有 ID,对我来说一个非常有用的提示是......

标签: java arrays


【解决方案1】:

那么几个cmets:

-您的循环如下所示:

for(i = j; i < arr.length; i++)

你应该声明

for(int i = j; i< arr.length; i++);

要么你还没有声明 i,这会给你一个编译错误,要么你之前声明了 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;

这将帮助您更快地了解程序中发生的事情,并且不要害怕添加更多类似的东西。

【讨论】:

    【解决方案2】:

    制作Test2 implements Comparable&lt;Test2&gt; 并改用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&lt;Test2&gt;,那就更好了(Effective Java 2nd Edition:Item 25:Prefer lists to arrays)。

    另见


    如果您必须实现自己的排序,那么您需要arr[i].getId() &lt; arr[indexMin].getId() 来代替arr[i] &lt; arr[indexMin]。这假设它被声明为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 具有可打印的@Overridepublic String toString(),否则您可以单独访问成员方法。

    另见

    【讨论】:

    • OP 必须自己实现排序。
    • @Peter:哦,是课程教授?我想也许是研究教授。
    最近更新 更多