在循环中使用数组名称作为变量(Java)

时间:2018-09-17 09:41:40

标签: java arrays loops variables

今天,当我试图通过在循环中使用数组名称作为变量来简化代码时遇到了一个问题,但是编译器不断告诉我变量(数组名称)是一个字符,而不是数组,所以怎么办我解决这个问题以实现我的问题标题吗? ps我知道下面的代码还有很多事情要解决,但是我只想提供一个有关以下内容的示例 在循环中使用数组名称作为变量:

  

(compare [i + 1])[i]>(compare [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;    
            }
        }
    }

}

2 个答案:

答案 0 :(得分:4)

您的代码未在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中不起作用。 当然,可以通过多种方式使用反射来实现此目的。但我强烈建议在这种情况下不要使用反射。

=== EDIT1 ===

我正在使用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[][]的{​​{1}}数组,创建一个数组,该数组将容纳compare个“事物”。您的初始数组int[]等正是该格式a = {4, 5, 3}。 这使您可以只在比较数组中使用变量本身。 因此,在int[]行中,字符a不是字符,而是实际变量,引用了您最初定义的数组。

缩短了一点:

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

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

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

想象一下

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

!不是真正的Java代码! int[] a = {1, 2, 3}; char access = 'a'; int[] reflectionOfA = (int[])myClass.getMember(access); 方法接收字符串值(纯文本)。然后它将搜寻myClass.getMember(String),并搜索名称为myClass,即access的成员。它将找到int []数组'a'并返回它。由于a方法不知道,搜索到的成员是什么类型(是int [],String还是其他类型?),您需要提供该信息。在这种情况下,它是演员。但是我认为实际的Java Reflections需要另一个参数,该参数定义了返回类型。

如果您对反射一无所知,请不要使用它们!了解他们。它们有很大的缺点,因为它们的性能不太好(它们在每次调用时都会通过对象进行爬网,没有缓存,没有优化,无论如何)。

答案 1 :(得分:0)

在Java中,您无法使用局部变量的名称字符串轻松访问局部变量。相反,您可以直接引用变量。

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