0

I consider myself an intermediate Java programmer having been at it for a year and a half and having some experience in other languages. However I have run into an issue that I feel I need an experts help on.

As I understand it arrays when created by java exist somewhat outside of where they were created i.e. if you create an array called s in one class and another called s in a second class then try to use both those classes as part of a program you will run into problems with them overwriting each other.

However this brings me to an interesting dilemma. What if one wanted to create a unique array on-demand for an infinite number of sets of user input. i.e. is it possible to have the user enter a string value for use as the array name or have a generic value that then gets a number or letter appended to it. This is more a theoretical issue (there being other ways to accomplish the same thing) but any insight would be greatly appreciated.

4

3 回答 3

1

即是否可以让用户输入一个字符串值用作数组名称,或者有一个通用值,然后将一个数字或字母附加到它上面。

用户不需要关心您的数组名称。数组的名称不应该对用户可见,也不应该以任何方式影响您的应用程序。

如果您想允许用户创建他可以存储在FriendlyName下的元素集合,您可以为此使用 (Hash)map:

Map<String, Integer[]> userDefinedArrays = new HashMap<>();

userDefinedArrays.put("NameTheUserSelectsForThisArray", new Integer[]{1,2,3});

此地图的“密钥”将是用户提供的FriendlyName - 他仍然不知道实际地图是否被调用userDefinedArrays- 甚至someMapThatHoldsSomeThingsTheUserWantToUse.

实际变量的名称需要在设计时设置并且是固定的(至少在 java 中)

如果您在一个类中创建一个名为 s 的数组,而在第二个类中创建另一个名为 s 的数组,那么尝试将这两个类用作程序的一部分,您将遇到它们相互覆盖的问题。

不!声明的每个变量都存在于它自己的范围内!您可以在其范围内更改数组的值,也可以在不同的范围内重用相同的名称 - 没关系。如果您尝试重新声明当前范围内已经存在的变量,您的编译器会警告您!- 你简单的不能那样做。

例子:

class MyApplication{
   public static void Main(String[] args){
      Integer[] arr1;
      Integer[] arr1; //Compiler error!
   }
}

但:

class MyApplication{
   public static void Main(String[] args){
      Integer[] arr1;
      Integer[] arr2; 
   }
}

或者

class MyApplication{
   public static void Main(String[] args){
      foo();
      bar();
   }

   public static void foo(){
      Integer[] arr1;
   }  

   public static void bar(){
      Integer[] arr1;
   }  
}

很好。只存在于orarr1的范围内。foo()bar()

于 2014-05-14T20:03:45.133 回答
0

据我了解,由java创建的数组在某种程度上存在于它们创建的位置之外,即如果您在一个类中创建一个名为s的数组,在第二个类中创建另一个名为s的数组,然后尝试将这两个类用作程序的一部分,您将遇到彼此覆盖的问题。

我想也许你是误会了。除非您像 yshavit 在您的评论中指出的那样故意这样做,否则这不会发生。Cat 类中名为 S 的类的成员不会指向 Dog 类中名为 S 的成员。你必须不遗余力地做到这一点。

简而言之,如果您在实例化类时没有在它们之间传递引用,那么大多数情况下这不会偶然发生。

如果想为无限数量的用户输入按需创建一个独特的数组怎么办。

您可能想要使用 ArrayList

ArrayList<String[]> myList = new ArrayList<String[]>();

或哈希图

Map<Integer,String[]> myMap = new HashMap<Integer,String[]>();

您使用哪一个取决于您使用它的目的。如果您需要更快地访问任意元素,请使用地图。如果您计划迭代地访问它们,ArrayList 将可以正常工作。

是否可以让用户输入一个字符串值用作数组名称,或者有一个通用值,然后附加一个数字或字母。这更像是一个理论问题(还有其他方法可以完成同样的事情),但任何见解都将不胜感激。

在这种情况下,您想使用 hashmap 解决方案,您可以很容易地在 java 中选择映射的键类型。

你会想读这个

http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

或者这个,开始。

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

于 2014-05-14T20:20:38.267 回答
0

在我的示例中,您正在谈论的两个不同的类是ClassOneClassTwo。正如您所说,在保持字段名称相同的同时存在某种冲突。我在这两个类中都使用了arr。制作MyArray超类的原因只是代码重用。为什么我使用抽象 MyArray 类以及为什么我使用公共静态字段不是我们要讨论的问题。在TestApp中,我使用了ClassOneClassTwo两个类的arr没有任何问题。恕我直言,使用反射 API 或动态类型语言可以做到这一点。我不太确定。
is it possible to have the user enter a string value for use as the array name

class ClassOne extends MyArray {
    public static int[] arr = new int[5];
}

class ClassTwo extends MyArray {
    public static int[] arr = new int[5];
}

abstract class MyArray {
    public static void setValue(int arr[], int index, int value) {
        arr[index] = value;
    }

    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}


public class TestApp {
    public static void main(String[] args) {

        ClassOne.setValue(ClassOne.arr, 1, 30);
        ClassTwo.setValue(ClassTwo.arr, 1, 50);

        ClassOne.printArray(ClassOne.arr);
        ClassOne.printArray(ClassTwo.arr);
        ClassTwo.printArray(ClassOne.arr);
        ClassTwo.printArray(ClassTwo.arr);


    }
}
于 2014-05-14T20:10:07.707 回答