我认为自己是一名中级Java程序员,已经在这里工作了一年半,并且拥有一些其他语言的经验。但是我遇到了一个我认为需要专家帮助的问题。
据我所知,java创建的数组存在于创建它们之外的位置,即如果在一个类中创建一个名为s的数组而在另一个类中创建另一个名为s的数组,那么尝试将这两个类作为一个类的一部分使用程序你会遇到问题,他们互相覆盖。
然而,这让我陷入了一个有趣的困境。如果想要为无限数量的用户输入集创建一个唯一的数组,该怎么办?即,是否可以让用户输入字符串值以用作数组名称,或者具有通用值,然后获取附加到其上的数字或字母。这更像是一个理论问题(还有其他方法可以完成同样的事情),但任何见解都会受到高度赞赏。
答案 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