首頁 >Java >Java 如何打亂二維數組的行?

Java 如何打亂二維數組的行?

PHPz
PHPz轉載
2024-02-09 16:15:20943瀏覽

Java中如何打亂二維數組的行?這是許多開發者經常遇到的問題。打亂二維數組的行可以透過使用Collections類別中的shuffle()方法來實現。此方法可以隨機打亂集合中的元素順序。首先,我們需要將二維數組轉換為List形式,然後再使用shuffle()方法對列表進行隨機排序。最後,將列表轉換回二維數組即可完成行的打亂。這種方法簡單易行,能夠有效地打亂二維數組的行,為開發者提供了更靈活的資料處理方式。

問題內容

我編寫了一些程式碼來讀取csv 檔案並進行一些資料預處理,然後它應該對2d 數組的行而不是列進行洗牌,儘管其順序無法更改。

我遇到的問題是它確實會打亂 2d 數組的行和列,但我不知道如何修復它。

import java.io.*;
import java.nio.file.paths;
import java.util.*;

public class randomforest
{
  public static void shuffle2darray()
    {
        int numrows = allfeatures.length;
        list<integer> indices = new arraylist<>();

        // populate the list with indices
        for (int i = 0; i < numrows; i++) {
            indices.add(i);
        }

        // shuffle the list of indices
        collections.shuffle(indices);

        // create a copy of the original array
        int[][] shuffledarray = new int[numrows][allfeatures[0].length];

        // use shuffled indices to rearrange the rows of the original array
        for (int i = 0; i < numrows; i++) {
            shuffledarray[i] = allfeatures[indices.get(i)];
        }

        // update the original array with the shuffled values
        allfeatures = shuffledarray;
    }

    public static void main(string[] args) throws ioexception
    {
        randomforest rf = new randomforest("se-dermatitis dataset.csv");

        rf.getdatarows();
        rf.markfilters();
        rf.removeattributes();

        int count = 1;
        int counter = 1;

        int totalpredacc = 0;

        int allfeaturessize = allfeatures.length;
        int foldsize = allfeaturessize / 10;

        double[] threshold = {0.4, 0.5, 0.6, 0.7};

        shuffle2darray();
    }
}

還有其他方法,如您所見,但僅此 shuffle2darray() 方法就可以正常工作。

這樣我就可以將資料隨機分成 10 份,以便我可以進行 10 份交叉驗證

我確實嘗試將 print 語句放入程式碼中,並嘗試在嘗試洗牌之前和之後檢查 2d 數組,然後檢查 csv 檔案以確保該行的順序正確。

這是過濾前的小範例:

cpi_9606.ensp00000000233 cpi_9606.ensp00000000412 cpi_9606.ensp00000000442 cpi_9606.ensp00000001008 cpi_9606.ensp00000001146 cpi_9606.ensp00000002165 cpi_9606.ensp00000002829 cpi_9606.ensp00000003084 cpi_9606.ensp00000003100
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 180

過濾和打亂列後:

cpi_9606.ENSP00000000442 cpi_9606.ENSP00000001008 cpi_9606.ENSP00000003084 cpi_9606.ENSP00000003100 cpi_9606.ENSP00000005178 cpi_9606.ENSP00000011292 cpi_9606.ENSP00000011653 cpi_9606.ENSP00000012443 cpi_9606.ENSP00000013034 cpi_9606.ENSP00000014930
0 900 0 0 0 900 0 0 0
900 0 0 0 0 0 928 900 338
322 236 0 0 0 0 0 0 0

解決方法

您的程式碼片段未能包含關鍵元素:您想要排序的陣列。

所以,在黑暗中進行一次瘋狂的嘗試,我猜它看起來像這樣:

int[][] allfeatures = ....;

要洗牌,它是一個襯墊。您可以放棄您擁有的所有程式碼:

collections.shuffle(arrays.aslist(allfeatures));

那麼,為什麼這會起作用?

因為不存在二維數組這樣的東西。 java 根本沒有它們。

您擁有的 int[][] allfeatures 不是二維陣列。它是一個一維數組,其元件類型為 int 數組。因此, arrays.aslist(allfeatures) 非常好,因為您有一個物件陣列(不是基元) - 每個物件都是一個 int 陣列。此表達式的型別為 listdfcfb097077124ccf9617875ee28bb24

arrays.aslist 傳回一個仍然由底層陣列支援的清單。因此, .set() 有效,但 .add() 無效(因為陣列可以更改其元素,但不能增長或縮小)。 collections.shuffle 可以打亂任何列表,並且僅使用.set.get 來執行此操作: arrays.aslist 支持的操作就很好。

這一切的結果是,這將重新調整 allfeatures 本身。

如果你想保持allfeatures不變,請先複製:

int[][] clone = allFeatures.clone();
Collections.shuffle(Arrays.asList(clone));

以上是Java 如何打亂二維數組的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除