首页 > 解决方案 > 在循环中使用数组名称作为变量(Java)

问题描述

今天我在尝试通过在循环中使用数组名作为变量来简化代码时遇到了一个问题,但是编译器一直告诉我变量(数组名)是一个字符,而不是一个数组,那么我该如何解决这个问题实施我的问题标题?ps 我知道下面的代码还有很多问题需要解决,但我只想提供一个关于在循环中使用数组名称作为变量的示例:

(比较[i+1])[i] > (比较[i])[i]

class ArraySort{

    public static void main(String[] args){

    int[] a = {4, 5, 3};
    int[] b = {7, 5};
    int[] c = {7, 8, 9};
    int[] d = {4, 9, 9};
    int[] e = {5, 1};
    int[] f = {3, 8, 2, 5};     

    System.out.println("Before sort: 453 75 789 499 51 3825");
    System.out.println("After sort:");

    char[] compare = {'a', 'b', 'c', 'd', 'e', 'f'};
    char temp;

    for(int i = 0; i < 3; i++ ){ // 3 --> max number amount to compare;  
        for(int j = 0; j < compare.length-1; j++){
            if((compare[i+1])[i] > (compare[i])[i]){ // problem is here
                temp = compare[i];
                compare[i] = compare[i+1];
                compare[i+1] = temp;    
            }
        }
    }

}

标签: javaarraysloopsvariables

解决方案


你的代码没有在我的 Java8 环境中编译,我不得不改变一些东西。

首先,数组初始化需要是:

int[] a = {4, 5, 3};
int[] b = {7, 5};
int[] c = {7, 8, 9};
int[] d = {4, 9, 9};
int[] e = {5, 1};
int[] f = {3, 8, 2, 5};

然后 compare 和 temp 对象的 init 已更改为数组:

int[][] compare = {a, b, c, d, e, f};
int[] temp;

完整的方法现在看起来像这样:

class ArraySort
{

    public static void main(String[] args)
    {

        int[] a = {4, 5, 3};
        int[] b = {7, 5};
        int[] c = {7, 8, 9};
        int[] d = {4, 9, 9};
        int[] e = {5, 1};
        int[] f = {3, 8, 2, 5};

        System.out.println("Before sort: 453 75 789 499 51 3825");
        System.out.println("After sort:");

        int[][] compare = {a, b, c, d, e, f};
        int[] temp;

        for (int i = 0; i < 3; i++)
        { // 3 --> max number amount to compare;
            for (int j = 0; j < compare.length - 1; j++)
            {
                if ((compare[i + 1])[i] > (compare[i])[i])
                { // problem is here
                    temp = compare[i];
                    compare[i] = compare[i + 1];
                    compare[i + 1] = temp;
                }
            }
        }

    }
}

这编译没有任何错误或警告。不能说,如果结果符合预期,因为您的预期结果对我来说不是 100% 清楚。但是上面提到的编译器问题已经消失了。

使用包含变量名的字符或字符串,它在 Java 中并不真正工作。当然,有一些方法可以使用反射来实现这一点。但我强烈建议在这种情况下不要使用反射。

=== 编辑1 ===

我正在使用int[][] compare = {a, b, c, d, e, f};而不是char[] compare = {'a', 'b', 'c', 'd', 'e', 'f'};. 为什么?

您在代码的开头a = {4, 5, 3}等处定义了一些数组。所以您有一个变量名为a. 如果您在 char 数组中使用'a'(注意'),则它只是字符'a',它没有对存储在变量中的实际数组的任何引用a。你也可以选择'x'或任何其他角色。

在 char 中使用变量名而不是变量本身需要您手动创建 char'a'和变量之间的“链接”。a您可以为此使用反射。稍后将详细介绍反射。

通过不使用 char 数组而是使用int[][]数组 for compare,您可以创建一个包含int[]“事物”的数组。而您的初始数组a = {4, 5, 3}等正是这种格式int[]。这使您可以只在比较数组中使用变量本身。因此,在 lineint[][] compare = {a, b, c, d, e, f};中,字符 a 不是字符,而是实际变量,引用了您最初定义的数组。

稍微缩短一点:

int[] a = {4, 5, 3};
int[] b = {7, 5};
int[][] compare = {a, b};

是相同的

int[][] compare = {{4, 5, 3}, {7, 5}};

如果你想进行反思......你应该去阅读它。这是一个复杂的话题。非常非常非常简单地说,只是为了让您了解:通过反射,您可以在运行时访问(和操作)源代码。

想象它是这样的

int[] a = {1, 2, 3};
char access = 'a';

int[] reflectionOfA = (int[])myClass.getMember(access);

!不是真正的 Java 代码!myClass.getMember(String)方法接收一个字符串值,纯文本。然后它会通过 爬取myClass并搜索名称为 的成员access,即'a'。它会找到 int[] 数组a并返回它。由于getMemberMethod 无法知道搜索到的成员是什么类型(是 int[]、String 还是其他什么?),您需要提供该信息。在这种情况下,它是一个铸件。但我认为实际的 Java 反射采用另一个参数,它定义了返回类型。

如果您对反射一无所知,请不要使用它们!阅读有关它们的信息。它们有一个很大的缺点,因为它们的性能不是很好(它们在每次调用时都在对象中爬行,没有缓存,没有优化,无论如何)。


推荐阅读