簡體   English   中英

代碼不適用於數組(arraylist中的多個數組)

[英]code does not work with arrays (multiple arrays in arraylist)

嗨,我在數組上有一點問題。

這是代碼:

int frame_size = 410;
        int frame_shift = 320;
        ArrayList<double[]> frames = new ArrayList<double[]>();
        for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) {
            double[] frame = new double[frame_size];
            System.arraycopy(inbuf, i, frame, 0, frame_size);
            frames.add(frame);
        }

在這里,我將一個大數組分成幾個小數組,並將它們添加到arraylist

我需要獲取更多的ArrayList數組並將它們傳遞給函數,然后接受答案並組合處理的數組:

int[] Cover = new int[frames.size() * nParam];

        for (int i = 0; i < frames.size(); i++) {
            double[] finMc = Gos.getVek(frames.get(i));
            for (int c = 0; c < finMc.length; c++) {
                int mc = (int) finMc[c];
                for (int m = 0; m < Cover.length; m++) {
                    Cover[m] = mc;
                }
            }
        }

所有這些代碼均無效(

數組的所有元素均為零Cover。

Сover[0] = 0
Cover[1] = 0
Cover[2] = 0
...

請幫助解決問題!)

先感謝您)

更新資料

int frame_size = 410;
        int frame_shift = 320;
        ArrayList<double[]> frames = new ArrayList<double[]>();
        for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) {
            double[] frame = new double[frame_size];
            System.arraycopy(inbuf, i, frame, 0, frame_size);
            frames.add(frame);
        }

        int[] Cover = new int[frames.size() * nParam];

        for (int i = 0; i < frames.size(); i++) {
            double[] finMc = Gos.getVek(frames.get(i));
            for (int c = 0; c < finMc.length; c++) {
                int mc = (int) finMc[c];
                Cover[i * frames.size() + c] = (int) finMc[c];
            }
        }

代碼^不起作用(

更新2

double[] inbuf = new double[Size];
        inbuf = toDoubleArray(Gos.data);

        inbuf[2] = 10;
        inbuf[4] = 14;

toDoubleArray

public static double[] toDoubleArray(byte[] byteArray) {
    int times = Double.SIZE / Byte.SIZE;
    double[] doubles = new double[byteArray.length / times];
    for (int i = 0; i < doubles.length; i++) {
        doubles[i] = ByteBuffer.wrap(byteArray, i * times, times)
                .getDouble();
    }
    return doubles;
}

代碼不起作用:

int frame_size = 410;
        int frame_shift = 320;
        ArrayList<double[]> frames = new ArrayList<double[]>();
        for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) {
            double[] frame = new double[frame_size];
            System.arraycopy(inbuf, i, frame, 0, frame_size);
            frames.add(frame);
        }


        double[] Cover = new double[frames.size() * nParam];

        for (int i = 0; i < frames.size(); i++) {
            double[] finMc = Gos.getVek(frames.get(i));
            for (int c = 0; c < finMc.length; c++) {
                Cover[i * frames.size() + c] = finMc[c];
            }
        }

立刻想到了一些想法:

1) for (int m = 0; m < Cover.length; m++) { Cover[m] = mc; } for (int m = 0; m < Cover.length; m++) { Cover[m] = mc; }

這個塊開始m超過在0通過循環每一次。 這意味着您總是在Cover數組的同一部分上進行書寫。 如此有效,它僅存儲了最后一幀的數據。 你可能是說

for(int m = i * frames.size(); m < (i+1)*frames.size(); i++) {
    Cover[m] = mc;
}

但這又引發了一個問題-您正在將相同的值( mc )寫入為整個數據幀分配的整個區域。 您可能希望將此循環與上一個循環合並,以免發生這種情況。

for (int c = 0; c < finMc.length; c++) {
    Cover[i * frames.size() + c] = (int)finMc[c];
 }

2) int mc = (int) finMc[c];

該行將值強制轉換為一個int ,該int將截斷存儲在finMc[c]處的值。 如果finMc[c]01之間,則在復制和finMc[c]數據時將產生0 上一期的問題更加復雜,該問題可確保僅復制最后一幀的數據。 只需刪除強制類型轉換並將Cover聲明為double而不是int的數組即可解決。

因此,總而言之,如果以這種方式編寫,則代碼可能會更好一些:

double[] Cover = new double[frames.size() * nParam];

for (int i = 0; i < frames.size(); i++) {
    double[] finMc = Gos.getVek(frames.get(i));
    for (int c = 0; c < finMc.length; c++) {
        Cover[i * frames.size() + c] = finMc[c];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM