BitSet

fatmanajjar Messages postés 15 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 8 juin 2017 - Modifié le 29 mai 2017 à 14:15
fatmanajjar Messages postés 15 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 8 juin 2017 - 1 juin 2017 à 06:05
Bonjour,

Peut on créer plusieurs Bitset ? ou bien une matrice de BitSet ?
Je sais que la création de BitSet se fait de la maniére suivante :

BitSet bit = new BitSet();
bit.set(1); // Mettre le bit de l'indice 1 à true

j'ai besoin de lire un fichier, texte et d'extraire son contenu.
le contenu du fichier contient les positions des 1 dans une matrice binaire.

Si je recapitule, je veux remplir une matrice avec les chiffres (zero) et (un).
Les positions des (uns) je doit les lire à partir d'un fichier texte.
Pouvez vous me donner votre avis ?
Merci d'avance.


Voici le code que j'ai implémenté


import java.io.*;
import java.util.BitSet;

public class Topk
{
 
 public static void main(String args[])throws FileNotFoundException, IOException
 {
  
  //Declaration des variables
  
  String[] ligne = new String[5];
  String l =new String();
  int nbl=0;
  BitSet b=new BitSet(1024);
  
  //Ouverture du fichier input
  File filer = new File("C:/Users/File.txt");
     
  //Lecture du fichier
  try (BufferedReader reader = new BufferedReader(new FileReader(filer)))
     {
         while (true)
         {
             String line = reader.readLine();  //Diviser la ligne en caractere
             if (line == null) 
             {
                 break;
             }
             
             String[] fields = line.split(" ");
             // process fields here
             for(int k=0;k<fields.length;k++)
             {
                 System.out.println("fields["+k+"]   : " +fields[k]);
                 b.set(Integer.parseInt(fields[k]));
                 System.out.println(b.toString());    
                 
                                
             }
            
         }
     }
 }

 }



EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.


--

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
29 mai 2017 à 19:10
Bonjour,

Il faudrait voir un extrait de ton fichier texte et le résultat que tu souhaites obtenir pour vérifier mais j'ai un doute sur le b.set(Integer.parseInt(fields[k]));

Mais oui on peut faire une matrice de BitSet mais il faudrait lors de sa création connaître ses dimensions, ce que l'on ne peut pas faire sans avoir lu une première fois le fichier.
En revanche on pourrait par exemple faire une Map dont les clés seraient les coordonnées (x,y) de ta matrice.

Pour la lecture de fichier ça peut se simplifier un peu.

Exemple :

Map<Point, BitSet> map = new LinkedHashMap<>();
try (Scanner reader = new Scanner(new File("C:/Users/File.txt"))) {
    for (int y = 0; reader.hasNextLine(); y++) {
        String[] fields = reader.nextLine().split(" ");
        for (int x = 0; x < fields.length; x++) {
            Point point = new Point(x, y);
            BitSet bitSet = new BitSet();
            bitSet.set(Integer.parseInt(fields[x]));
            map.put(point, bitSet);
            System.out.println(point + "\t" + fields[x] + "\t" + bitSet);
        }
    }
}
System.out.println(map);
0
fatmanajjar Messages postés 15 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 8 juin 2017
Modifié le 29 mai 2017 à 21:55
Bonsoir
Je vous remercie pour votre retour.
En pièce jointe le contenue de mon fichier input, ainsi que ce que je veux obtenir en output.
Merci

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
29 mai 2017 à 22:01
À mon avis le BitSet est une fausse bonne idée, un tableau suffit.

try (Scanner reader = new Scanner(new File("C:/Users/File.txt"))) {
    while (reader.hasNextLine()) {
        boolean[] tab = new boolean[8];
        for (String number : reader.nextLine().split(" "))
            tab[Integer.parseInt(number)] = true;
        for (boolean bit : tab)
            System.out.print(bit ? "1 " : "0 ");
        System.out.println();
    }
}
0
fatmanajjar Messages postés 15 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 8 juin 2017 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
29 mai 2017 à 22:44
Ça marche tres bien.
Merci beaucoup.
je veux manipulé le contenu binaire.
Ce n'est pas plus facile avec le BitSet ?

Car j'ai vu que la classe BitSet contient plusieurs methodes comme :
BitSet.AND()
BitSet.OR()
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127 > fatmanajjar Messages postés 15 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 8 juin 2017
29 mai 2017 à 22:50
Le mieux ce serait de donner tout les éléments de ta question en même temps...

Alors oui les manipulations AND et OR sont mieux avec un BitSet mais au vu de ce que tu as demandé précédemment je ne sais pas ce que tu vas en faire.
0
fatmanajjar Messages postés 15 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 8 juin 2017
30 mai 2017 à 07:18
Bonjour,
J'ai un algorithme prêt, je veux l'implémenter en java.
Le but de mon algorithme est de donner une description (Pattern) à une matrice binaire.

L'input de mon algorithme est un fichier plein de chiffre.
Je doit commencer par le transformer en un fichier plein de zero et des uns, car parmi les paramètres de l'algorithme il ya une matrice binaire.
une fois j'ai ma matrice (Binary matrix), je passe à :

Faire une opération ou exclusive avec une autre matrice
Déterminer le nombre de 1 (un) dans chaque colonne dans la matrice initiale.
Tester une fonction de cout sur le résultat de l'opération ( ou exclusive)
j'ai plusieurs autre taches à faire.
j'ai voulu décortiquer mon algorithme, et à chaque fois que je rencontre un petit soucis, je viens vers vous.

Merci pour votre aide et vos conseils.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
30 mai 2017 à 19:51
Dans ce cas le mieux serait sûrement de faire une classe BinaryMatrix de manipulation de tes données.

Après on peut avoir plusieurs implémentations, soit tu décris exhaustivement ta matrice avec un boolean[][] ou éventuellement une List<BitSet> (même si je trouve ça moins pertinent), soit on considère que tu cibles des matrices creuses et un Set<Point> suffirait (voir mon premier code avec la Map)

Tu peux d'ailleurs faire plusieurs implémentations et comparer ce qui est le mieux par la suite, même si elles devraient toute hériter d'une interface commune, éventuellement aidé d'une classe abstraite générique.

Exemple :

public interface Matrix<E> {

    int getWidth();

    int getHeight();

    E getValue(int x, int y) throws IndexOutOfBoundsException;

    E setValue(int x, int y, E value) throws IndexOutOfBoundsException;
}

public interface BooleanMatrix extends Matrix<Boolean> {

    boolean getBoolean(int x, int y) throws IndexOutOfBoundsException;

    boolean setBoolean(int x, int y, boolean value) throws IndexOutOfBoundsException;

    default boolean setTrue(int x, int y) throws IndexOutOfBoundsException {
        return setBoolean(x, y, true);
    }
    
    default boolean setFalse(int x, int y) throws IndexOutOfBoundsException {
        return setBoolean(x, y, false);
    }

    @Override
    default Boolean getValue(int x, int y) throws IndexOutOfBoundsException {
        return getBoolean(x, y);
    }

    @Override
    default Boolean setValue(int x, int y, Boolean value) throws IndexOutOfBoundsException {
        return setBoolean(x, y, value);
    }
}

public abstract class AbstractBooleanMatrix implements BooleanMatrix {

    protected final int width;
    protected final int height;

    public AbstractBooleanMatrix(int width, int height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public final int getWidth() {
        return width;
    }

    @Override
    public final int getHeight() {
        return height;
    }

    protected void checkBounds(int x, int y) throws IndexOutOfBoundsException {
        if (x < 0 || x >= width || y < 0 || y >= height)
            throw new IndexOutOfBoundsException("Matrix index out of ranges: " + x + ", " + y);
    }

    public final boolean setTrue(int x, int y) {
        return setBoolean(x, y, true);
    }

    public final boolean setFalse(int x, int y) {
        return setBoolean(x, y, false);
    }
}

public class ArrayBooleanMatrix extends AbstractBooleanMatrix {

    private final boolean[][] matrix;

    public ArrayBooleanMatrix(int width, int height) {
        super(width, height);
        matrix = new boolean[width][height];
    }

    @Override
    public boolean getBoolean(int x, int y) throws IndexOutOfBoundsException {
        checkBounds(x, y);
        return matrix[x][y];
    }

    @Override
    public boolean setBoolean(int x, int y, boolean value) throws IndexOutOfBoundsException {
        checkBounds(x, y);
        boolean result = matrix[x][y];
        matrix[x][y] = value;
        return result;
    }
}

public class Test {

    public static void main(String[] args) {
        BooleanMatrix matrix = new ArrayBooleanMatrix(2, 2);
        matrix.setFalse(0, 0);
        matrix.setTrue(0, 1);
        matrix.setBoolean(1, 1, matrix.getBoolean(1, 0));
    }
}
0
fatmanajjar Messages postés 15 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 8 juin 2017
Modifié le 1 juin 2017 à 07:02
Bonjour,
Voila le code que j'ai fait. Ça bien marché.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.BitSet;


public class Topk
{

    public static void main(String[] args) throws IOException 
    {
            
          //Declaration des variables
           BitSet b[]=new BitSet[20];// 20 number of transactions
           int nbl=0;
           int i=0;
          //Ouverture du fichier input
          File filer = new File("C:/File.txt");
          BufferedReader reader = new BufferedReader(new FileReader(filer));
          String line=reader.readLine();
                    while(line!=null)
                    {
                    b[i]=new BitSet(10);//10 number of items
                     if(!line.equals(""))
                     { String []fields = line.split(" ");
                     
                     
                     for(int k=0;k<fields.length;k++)
                     {   
                         b[i].set(Integer.parseInt(fields[k]));
                                       
                     }
                     }
                    
                   i++;
                   line=reader.readLine();
                 }
                 
                    
                    //write like binary Matrix
                    for(int j=0;j<i;j++)
                    {
                        for(int k=0;k<10;k++)
                        { if(b[j].get(k))
                            System.out.print(1+ "  ");
                        
                        else
                            System.out.print(0+ "  ");
                        }    
                        System.out.println();
                        
                    }
                      
             }
    }
0
Rejoignez-nous