如何将arraylist.add从java转换成c?

0g0grzrc  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(313)

我想知道你能不能帮我。
我有一个循环,我读一些数字。
我想初始化一个malloc,将这些数字中的每一个添加到一个数组中,但我们不知道malloc的大小。
你能帮我吗?
我想这样做。我知道如何用java实现,但我想用c实现:

int[] mark = {1, 2, 3, 4}; //how to do if we don't know the size of mark?

ArrayList<Integer> arr = new ArrayList;
for loop{
arr.add(mark[i]); //so, for each loop the malloc adds mark[i]. We don't care about the size of the malloc
}

谢谢!

ldioqlga

ldioqlga1#

java(7)arraylist实现:https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/arraylist.java
如果您查看add方法,您会注意到对该方法的每次调用都会检查数组的容量(如果已满)。
如果它是满的,它必须增长(通常是实际大小的50%),第207行,它使用value>>1,这与value/2相同。
在那之后,它只是把元素放在数组中。
这段代码可能对您有所帮助。


# ifndef MY_ARRAY_H

# define MY_ARRAY_H

# include <stdlib.h>

# include <stdio.h>

struct array {
    int* elements;
    unsigned int max_elements;
    unsigned int top;
};

void add(struct array* ptr_array, int element) {    
    ptr_array->top++;
    if(ptr_array->top == ptr_array->max_elements) {
        puts("Reached the maximum size. \tIncreasing ...");
        // grow, in java array list, the grow is 50% of the current size, 
        unsigned int new_max = ( ptr_array->max_elements / 2 ) + ptr_array->max_elements;
        printf("Current size: %d\n", ptr_array->max_elements);
        printf("New max size: %d\n", new_max);

        // number of positions multiplying the size of bytes that an integer uses in memory
        int* new_ptr = (int*) realloc((void*) ptr_array->elements, new_max * sizeof(int));
        ptr_array->elements = new_ptr;
        ptr_array->max_elements = new_max;
    }
    printf("Top: %d\n", ptr_array->top);
    ptr_array -> elements[ptr_array->top] = element; 
}

struct array init(void) {
    struct array arrayList;
    int initial_size = 2; // as java, the default init size is 2.
    arrayList.elements = (int*) malloc(initial_size * sizeof(int));
    arrayList.max_elements = initial_size;
    arrayList.top = -1;
    return arrayList;
}

int main(void) {
    struct array arrayList = init();

    int max = 25;

    for(int index = 0; index < max; index++) {
        add(&arrayList, index + 100);
    }

    for(int index = max -1; index > 0; index--) {
        printf("%d, ", arrayList.elements[index]);
    }
    printf("%d.\n", arrayList.elements[0]);

    return 0;

}

# endif

另外,我也是一名java程序员。:)

相关问题