有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是创建计数数字数组的最有效方法

制作给定长度的数组,每个元素都包含其下标,最有效的方法是什么

我的虚拟级别代码的可能描述:

/**
 * The IndGen function returns an integer array with the specified dimensions.
 *  
 *  Each element of the returned integer array is set to the value of its 
 *  one-dimensional subscript.
 *  
 *  @see Modeled on IDL's INDGEN function: 
 *      http://idlastro.gsfc.nasa.gov/idl_html_help/INDGEN.html 
 *  
 *  @params size
 *  @return int[size], each element set to value of its subscript
 *  @author you
 *  
 *  */

public int[] IndGen(int size) {
    int[] result = new int[size];
    for (int i = 0; i < size; i++) result[i] = i;
    return result;
}

欢迎使用其他提示,如doc style

编辑

我在其他地方读到过for循环与其他方法相比效率有多低,例如Copying an Array

Using clone: 93 ms

Using System.arraycopy: 110 ms

Using Arrays.copyOf: 187 ms

Using for loop: 422 ms

这个网站上对一些问题的富有想象力的回答给我留下了深刻的印象,例如:Display numbers from 1 to 100 without loops or conditions。下面是一个可能会建议一些方法的答案:

public class To100 {
public static void main(String[] args) {
        String set = new java.util.BitSet() {{ set(1, 100+1); }}.toString();
        System.out.append(set, 1, set.length()-1);
    }
}

如果你不能解决这个具有挑战性的问题,无需发泄:只需转到下一个你可以处理的未回答问题


共 (3) 个答案

  1. # 1 楼答案

    我唯一能想到的是使用“++i”而不是“i++”,但我认为java编译器已经有了这种优化

    除此之外,这几乎是最好的算法

    你可以创建一个类,它的行为就像它有一个数组,但它没有,它只会返回它得到的相同的数字(也就是标识函数),但这不是你所要求的

  2. # 2 楼答案

    正如其他人在回答中所说,您的代码已经接近我所能想到的最高效的代码,至少对于小型阵列来说是如此。如果您需要多次创建这些数组,而且它们非常大,您可以一次性创建所有数组,然后复制它们,而不是在for循环中不断迭代。如果数组非常大,复制操作将比在数组上迭代更快。可能是这样的(在本例中,最多1000个元素):

    public static int[][] cache = {{0},{0,1},{0,1,2},{0,1,2,3},{0,1,2,3,4}, ..., {0,1,2,...,998,999}};
    

    然后,根据需要多次创建这些数组的代码,您可以使用以下内容:

    int[] arrayOf50Elements = Arrays.copyOf(cache[49], 50);
    

    请注意,这样可以使用大量内存来提高速度。我想强调的是,只有当你需要多次创建这些阵列,阵列非常大,并且最大速度是你的要求之一时,这才是值得的。在我能想到的大多数情况下,你提出的解决方案将是最好的

    编辑:我刚刚看到了您需要的大量数据和内存。我提出的方法需要n^2级的内存,其中n是期望的最大整数。在这种情况下,这是不切实际的,因为你需要大量的内存。算了吧。我离职是因为它可能对其他人有用

  3. # 3 楼答案

    由于一次使用TB内存是不可行的,尤其是同时使用它们进行任何计算,因此您可能会考虑使用生成器。(你可能计划在阵列上循环,对吧?)使用生成器时,不需要初始化数组(这样就可以立即开始使用它),而且几乎不使用内存(O(1))

    我在下面提供了一个实现示例。它受到long原语的限制

    import java.util.Iterator;
    import java.util.NoSuchElementException;
    
    public class Counter implements Iterator<Long> {
        private long count;
        private final long max;
    
        public Counter(long start, long endInclusive) {
            this.count = start;
            this.max = endInclusive;
        }
    
        @Override
        public boolean hasNext() {
            return count <= max;
        }
    
        @Override
        public Long next() {
            if (this.hasNext())
                return count++;
            else
                throw new NoSuchElementException();
    
        }
    
        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
    

    找到下面的用法演示

    Iterator<Long> i = new Counter(0, 50);
    while (i.hasNext()) {
        System.out.println(i.next());  // Prints 0 to 50
    }