Maison >Java >Comment mélanger les lignes d'un tableau 2D en Java ?

Comment mélanger les lignes d'un tableau 2D en Java ?

PHPz
PHPzavant
2024-02-09 16:15:20942parcourir

Comment brouiller les lignes d'un tableau bidimensionnel en Java ? C’est un problème que de nombreux développeurs rencontrent souvent. Le brassage des lignes d'un tableau à deux dimensions peut être réalisé en utilisant la méthode shuffle() dans la classe Collections. Cette méthode peut modifier aléatoirement l’ordre des éléments de la collection. Tout d’abord, nous devons convertir le tableau bidimensionnel sous forme de liste, puis utiliser la méthode shuffle() pour trier aléatoirement la liste. Enfin, la reconversion de la liste en un tableau à deux dimensions termine le brassage des lignes. Cette méthode est simple et facile à mettre en œuvre, peut brouiller efficacement les lignes de tableaux bidimensionnels et offre aux développeurs un moyen plus flexible de traiter les données.

Contenu de la question

J'ai écrit du code pour lire un fichier csv et effectuer un prétraitement des données, puis il devrait mélanger les lignes d'un tableau 2D au lieu des colonnes, bien que son ordre ne puisse pas être modifié.

Le problème que j'ai est qu'il brouille les lignes et les colonnes du tableau 2D, mais je ne sais pas comment y remédier.

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

Il existe d'autres méthodes, comme vous pouvez le voir, mais seule cette méthode shuffle2darray() fonctionne correctement.

De cette façon, je peux diviser aléatoirement les données en 10 afin de pouvoir effectuer 10 validations croisées

J'ai essayé de mettre des instructions d'impression dans le code et j'ai essayé de vérifier le tableau 2D avant et après avoir essayé de mélanger, puis de vérifier le fichier csv pour m'assurer que les lignes étaient dans le bon ordre.

Voici un petit exemple avant filtrage :

cpi_9606.ensp00000000233cpi_9606.ensp00000000412cpi_9606.ensp00000000442cpi_9606.ensp00000001008cpi_9606.ensp00000001146cpi_9606.ensp00000002165cpi_9606.ensp00000002829cpi_9606.ensp00000003084cpi_9606.ensp0000000310000000000000000000000000000180
Après filtrage et brassage des colonnes :

cpi_9606.ENSP00000000442cpi_9606.ENSP00000001008cpi_9606.ENSP00000003084cpi_9606.ENSP00000003100cpi_9606.ENSP00000005178cpi_9606.ENSP00000011292cpi_9606.ENSP00000011653cpi_9606.ENSP00000012443cpi_9606.ENSP00000013034cpi_9606.ENSP000000149300900000900000900000009289003383222360000000
Solution de contournement

Votre extrait de code ne contient pas un élément clé : le tableau que vous souhaitez trier.

Donc, en s'amusant dans le noir, je suppose que ça ressemble à ceci :

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

Pour mélanger, c'est un liner. Vous pouvez donner tout le code que vous possédez :

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

Alors, pourquoi ça marche ?

Parce qu’il n’existe pas de tableau bidimensionnel. Java ne les a pas du tout.

Ce que vous possédez

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

Les opérations prises en charge sont très bonnes. arrays.aslist 返回一个仍然由底层数组支持的列表。因此, .set() 有效,但 .add() 无效(因为数组可以更改其元素,但不能增长或缩小)。 collections.shuffle 可以打乱任何列表,并且仅使用 .set.get 来执行此操作: arrays.aslist

Le résultat de tout cela est que cela va se redimensionner

tout seul. allfeatures

Si vous souhaitez conserver

inchangé, veuillez d'abord cloner : allfeatures

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer