【问题标题】:How do you (get around) dynamically naming variables?你如何(绕过)动态命名变量?
【发布时间】:2011-11-02 10:20:30
【问题描述】:

我不确定我是否使用了正确的命名法,所以我会尽量让我的问题具体化。也就是说,我想这个问题一直都会出现,并且可能有几种不同的方法来处理它。

假设我有一个名为main 的数组(向量),包含 1980 年到 2000 年之间的 1000 个随机年份,并且我想从中创建 20 个单独的数组(向量)。这些数组将命名为 array1980array1981 等,长度也为 1000,但包含 1,其中名称中的索引等于 main 中的相应元素,其他位置为 0。换句话说:

for(int i=0; i<1000; i++){
    if(main[i]==1980){
       array1980[i]=1;
    } else {
       array1980[i]=0;
    }

当然,我不想写其中的二十个,所以如果我可以在循环中创建新的变量名会很好。问题是您通常不能将变量名称分配给带有运算符的表达式,例如,

String("array"+ j)=... # returns an error

我目前使用的最多的是 Matlab,但我也可以在 Java、c++ 和 python 中做一些事情,我正在尝试了解人们如何解决这个问题。理想情况下,我希望能够以某种方式操纵单个变量(或子数组),使年份保留在变量名称(或数组索引)中,以减少出错的机会并使事情更容易处理一般来说。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 使用数组数组或数组字典/哈希表?

标签: java arrays variables variable-assignment


【解决方案1】:

对此的一般解决方案是不创建具有动态名称的变量,而是创建一个映射。具体实现方式因语言而异。

对于 Java,值得先看看the map section of the Sun collections tutorial

【讨论】:

    【解决方案2】:
    boolean main[][] = new boolean[1000][20];
    for (int i=0; i < 1000; i++) {
        array[i][main[i]-1980] = true;
    }
    

    在许多情况下,地图将是一个很好的解决方案,但在这里您可以使用 2-dim 布尔数组,因为大小在 (0-20) 之前是已知的,并且是连续的,并且是可数的。

    某些语言会将每个元素的布尔值数组初始化为 false,因此您只需将值设置为 truemain[i] 指向该值。

    由于main[i] 返回从 1980 到 2000 的数字,1980-main[i] 将返回 1980-1980=0 到 2000-1980=20。当然,要找到您的值,您必须将 1980 添加到第二个索引。

    【讨论】:

    • +1 - 数组数组而不是数组映射适合这种情况。
    • 谢谢。对于这个特定的任务,我宁愿使用 1 和 0,因为它们将直接使用矩阵运算进行运算。我猜我可以使用二进制类型,但无论如何它们都会在运行时转换为整数,对吧?
    【解决方案3】:

    Don Roby 的答案是正确的,但我想完成它。

    您可以为此使用地图,它看起来像这样:

    Map<Integer,ArrayList<Integer>> yearMap = new HashMap<Integer,ArrayList<Integer>>();
    yearMap.put(1980,new ArrayList<Integer>());
    for (int i = 0; i < 1000; i++){
        yearMap.get(1980).add(0);
    }
    yearMap.get(1980).set(999,1);
    System.out.println(yearMap.get(1980).get(999));
    

    但可能有更好的方法来解决您遇到的问题。你不应该问如何使用 X 来解决 Y,而是如何解决 Y。

    那么,您要解决的问题是什么?

    【讨论】:

    • +1:特别是“可能有更好的方法来解决问题”
    • 我目前正在进行数据分析,需要跟踪这些向量中的二十个左右以用作虚拟变量。我可以将它们放在一年虚拟数组的列中,然后将整个数组连接到我正在使用的各种数组上,但是任何全零向量都需要事先删除,并且我需要跟踪其中年份已被删除。也就是说,我是一名新手程序员,我的直觉通常是在遇到此类问题时创建一堆具有唯一名称的变量,只是想看看人们通常如何解决它。
    • 我想我的整个问题是“当您需要使用相同的数据进行大量操作时,如何保持一切井井有条?” (含糊不清,我知道)。我被 Don Roby 使用地图的想法所吸引,因为我只需要在单个分析的上下文中跟踪键(即,制作一个名为“GMM_analysis”的地图,其中包含我的所有数据、参数估计,统计等,然后制作另一个标题为“2SLS_analysis”,其中包含所有相同的原始数据,但不同的参数估计等。
    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2011-08-18
    • 2013-03-25
    • 1970-01-01
    • 2021-12-15
    • 2011-06-29
    • 2018-05-06
    相关资源
    最近更新 更多