【问题标题】:creating arrays on-demand in java在java中按需创建数组
【发布时间】:2014-05-14 19:10:13
【问题描述】:

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

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

然而,这让我陷入了一个有趣的困境。如果想为无限数量的用户输入按需创建一个独特的数组怎么办。即是否可以让用户输入一个字符串值用作数组名称,或者有一个通用值,然后附加一个数字或字母。这更像是一个理论问题(还有其他方法可以完成同样的事情),但任何见解都将不胜感激。

【问题讨论】:

  • 每次使用new 创建数组时,都会得到一个新数组。执行fooArray = barArray 之类的操作不会创建新数组,它只会将barArray 中包含的引用复制到fooArray。该引用基本上是一个地址,但复制该地址意味着两个引用都指向同一个对象。就像在卡片上写下你的地址不会复制你的房子一样;只是意味着有一种新的方法可以找到您的地址。
  • 在一个类上创建的对象将不能在另一个类中使用,因为它们具有相同的名称。你能举例说明你在说什么吗?我想你误解了什么,但我现在不能说。
  • 如果您发布了一个简单的、自包含的 sn-p 代码来说明您正在谈论的案例,这可能会有所帮助。否则我们只能猜测具体是什么让你绊倒了。
  • @yshavit +1 比喻,我喜欢它,方便。

标签: java arrays theory self-modifying


【解决方案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;
   }  
}

没问题。 arr1 只存在于foo() 或bar() 的范围内。

【讨论】:

    【解决方案2】:

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

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

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

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

    您可能想要使用 ArrayList

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

    或哈希图

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

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

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

    在这种情况下你想使用 hashmap 解决方案,你可以很容易地在 java 中选择一个 map 的 key 类型。

    你会想读这个

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

    或者这个,开始。

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

    【讨论】:

      【解决方案3】:

      在我的示例中,您所说的两个不同的类是 ClassOne 和 ClassTwo。正如您所说,在保持字段名称相同的同时存在某种冲突。我在这两个类中都使用了 arr。制作 MyArray 超类的原因只是代码重用。为什么我使用抽象 MyArray 类以及为什么我使用公共静态字段不是我们要讨论的问题。在 TestApp 中,我使用了 ClassOne 和 ClassTwo 两个类的 arr 没有任何问题。
      @ 987654321@
      恕我直言,使用反射 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);
      
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-24
        • 2012-01-10
        相关资源
        最近更新 更多