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 陣列。此表達式的型別為 list<int[]>
。
arrays.aslist
傳回一個仍然由底層陣列支援的清單。因此, .set()
有效,但 .add()
無效(因為陣列可以更改其元素,但不能增長或縮小)。 collections.shuffle
可以打亂任何列表,並且僅使用.set
和.get
來執行此操作: arrays.aslist
支持的操作就很好。
這一切的結果是,這將重新調整 allfeatures
本身。
如果你想保持allfeatures
不變,請先複製:
int[][] clone = allFeatures.clone(); Collections.shuffle(Arrays.asList(clone));
以上是Java 如何打亂二維數組的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!