Rumah >Java >Bagaimana untuk mengocok baris tatasusunan 2D di Jawa?

Bagaimana untuk mengocok baris tatasusunan 2D di Jawa?

PHPz
PHPzke hadapan
2024-02-09 16:15:20943semak imbas

Bagaimana untuk mengacak baris tatasusunan dua dimensi di Jawa? Ini adalah masalah yang sering dihadapi oleh banyak pembangun. Mengocok baris tatasusunan dua dimensi boleh dicapai dengan menggunakan kaedah shuffle() dalam kelas Koleksi. Kaedah ini boleh merombak susunan unsur dalam koleksi secara rawak. Mula-mula, kita perlu menukar tatasusunan dua dimensi ke dalam bentuk Senarai, dan kemudian gunakan kaedah shuffle() untuk mengisih senarai secara rawak. Akhir sekali, menukar senarai kembali kepada tatasusunan dua dimensi melengkapkan rombakan baris. Kaedah ini mudah dan mudah untuk dilaksanakan, boleh mengacak baris tatasusunan dua dimensi dengan berkesan dan menyediakan pembangun cara yang lebih fleksibel untuk memproses data.

Kandungan soalan

Saya menulis beberapa kod untuk membaca fail csv dan melakukan beberapa prapemprosesan data, kemudian ia harus mengocok baris tatasusunan 2d dan bukannya lajur, walaupun susunannya tidak boleh diubah.

Masalah yang saya hadapi ialah ia mengacau baris dan lajur tatasusunan 2d, tetapi saya tidak tahu bagaimana untuk membetulkannya.

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();
    }
}

Terdapat kaedah lain seperti yang anda lihat, tetapi hanya kaedah shuffle2darray() ini berfungsi dengan baik.

Dengan cara ini saya boleh membahagikan data secara rawak kepada 10 supaya saya boleh melakukan 10 pengesahan silang

Saya telah cuba meletakkan penyata cetakan ke dalam kod dan cuba menyemak tatasusunan 2d sebelum dan selepas cuba mengocok, dan kemudian menyemak fail csv untuk memastikan baris berada dalam susunan yang betul.

Berikut adalah contoh kecil sebelum menapis:

cpi_9606.ensp00000000233cpi_9606.ensp00000000412cpi_9606.ensp00000000442cpi_9606.ensp00000001008cpi_9606.ensp00000001146cpi_9606.ensp00000002165cpi_9606.ensp00000002829cpi_9606.ensp00000003084cpi_9606.ensp0000000310000000000000000000000000000180
Selepas menapis dan merombak lajur:

cpi_9606.ENSP00000000442cpi_9606.ENSP00000001008cpi_9606.ENSP00000003084cpi_9606.ENSP00000003100cpi_9606.ENSP00000005178cpi_9606.ENSP00000011292cpi_9606.ENSP00000011653cpi_9606.ENSP00000012443cpi_9606.ENSP00000013034cpi_9606.ENSP000000149300900000900000900000009289003383222360000000
Penyelesaian

Coretan kod anda gagal mengandungi elemen utama: tatasusunan yang ingin anda isih.

Jadi, setelah mencubanya dalam gelap, saya rasa ia kelihatan seperti ini:

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

Untuk mengocok, ia adalah pelapik. Anda boleh memberikan semua kod yang anda miliki:

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

Jadi, mengapa ini berkesan?

Sebab tiada tatasusunan dua dimensi. java tidak mempunyai mereka sama sekali.

Apa yang anda miliki

. int[][] allfeatures 不是二维数组。它是一个一维数组,其组件类型为 int 数组。因此, arrays.aslist(allfeatures) 非常好,因为您有一个对象数组(不是基元) - 每个对象都是一个 int 数组。该表达式的类型为 listdfcfb097077124ccf9617875ee28bb24

Operasi yang disokong adalah sangat baik. arrays.aslist 返回一个仍然由底层数组支持的列表。因此, .set() 有效,但 .add() 无效(因为数组可以更改其元素,但不能增长或缩小)。 collections.shuffle 可以打乱任何列表,并且仅使用 .set.get 来执行此操作: arrays.aslist

Hasil daripada semua ini ialah ini akan menskala semula

itu sendiri. allfeatures

Jika anda ingin mengekalkan

tidak berubah, sila klon dahulu: allfeatures

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

Atas ialah kandungan terperinci Bagaimana untuk mengocok baris tatasusunan 2D di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam