在java中按需创建数组

时间:2014-05-14 19:10:13

标签: java arrays theory self-modifying

我认为自己是一名中级Java程序员,已经在这里工作了一年半,并且拥有一些其他语言的经验。但是我遇到了一个我认为需要专家帮助的问题。

据我所知,java创建的数组存在于创建它们之外的位置,即如果在一个类中创建一个名为s的数组而在另一个类中创建另一个名为s的数组,那么尝试将这两个类作为一个类的一部分使用程序你会遇到问题,他们互相覆盖。

然而,这让我陷入了一个有趣的困境。如果想要为无限数量的用户输入集创建一个唯一的数组,该怎么办?即,是否可以让用户输入字符串值以用作数组名称,或者具有通用值,然后获取附加到其上的数字或字母。这更像是一个理论问题(还有其他方法可以完成同样的事情),但任何见解都会受到高度赞赏。

3 个答案:

答案 0 :(得分:1)

  

即。是否可以让用户输入字符串值以供使用   数组名称或具有通用值,然后获取数字或   附上的信。

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

如果您想允许用户创建可以存储在 FriendlyName 下的元素集合,您可以使用(哈希)地图:

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

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

&#34; Key&#34;这张地图将是用户提供的 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;
   }  
}

很好。 arr1仅存在于foo()bar()范围内。

答案 1 :(得分:0)

你所说的两个不同的课程是 ClassOne &amp;我的例子中有 ClassTwo 。正如您所说,在保持字段名称相同的同时存在某种冲突。我在这两个课程中都使用了 arr 。使 MyArray 超类的原因只是代码重用。为什么我使用了抽象的MyArray类&amp;为什么我使用公共静态字段不是我们讨论的问题。在 TestApp 中,我使用了 ClassOne &amp;类的 arr ClassTwo 没有任何问题。
is it possible to have the user enter a string value for use as the array name恕我们可以使用Reflection API或动态类型语言来实现。我对此不太了解。

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);


    }
}

答案 2 :(得分: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