BitSet

fatmanajjar 15 Messages postés dimanche 27 mai 2012Date d'inscription 8 juin 2017 Dernière intervention - 29 mai 2017 à 13:37 - Dernière réponse : fatmanajjar 15 Messages postés dimanche 27 mai 2012Date d'inscription 8 juin 2017 Dernière intervention
- 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.


--
Afficher la suite 

10 réponses

Répondre au sujet
KX 15089 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 14 décembre 2017 Dernière intervention - 29 mai 2017 à 19:10
0
Utile
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);
Commenter la réponse de KX
fatmanajjar 15 Messages postés dimanche 27 mai 2012Date d'inscription 8 juin 2017 Dernière intervention - Modifié par fatmanajjar le 29/05/2017 à 21:55
0
Utile
7
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

KX 15089 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 14 décembre 2017 Dernière intervention > fatmanajjar 15 Messages postés dimanche 27 mai 2012Date d'inscription 8 juin 2017 Dernière intervention - 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.
fatmanajjar 15 Messages postés dimanche 27 mai 2012Date d'inscription 8 juin 2017 Dernière intervention - 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.
KX 15089 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 14 décembre 2017 Dernière intervention - 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));
    }
}
Bonjour,
merci beaucoup pour votre aide.
Mais , selon des exigence du travail , j'ai besoin de lire mon fichier et d'utiliser BitSet pour générer le contenu binaire.

L'imprime ecran que j'ai mis en piece jointe est un petit exemple (échantillon) de mon fichier input.
Mon fichier input est plein de chiffre.

Comment je peux lire mon fichier qui contient des positions des chiffres 1, et positionner mes 1 en utilisant BitSet ?

Merci
fatmanajjar 15 Messages postés dimanche 27 mai 2012Date d'inscription 8 juin 2017 Dernière intervention - 31 mai 2017 à 19:32
Bonjour
Voici le code que j'ai ecrit :
import java.io.*;
import java.util.BitSet;

public class Topk
{
  public static void main(String args[])throws FileNotFoundException, IOException
 {
  
  //Declaration des variables
   BitSet b=new BitSet();
  
  //Ouverture du fichier input
  File filer = new File("C:/File.txt");
     
  //Lecture du fichier
  try (BufferedReader reader = new BufferedReader(new FileReader(filer)))
     {
         while (true)
         {
             String line = reader.readLine();  
             if (line == null) 
             {
                 break;
             }
             
             String[] fields = line.split(" ");
             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);
            
         }
     }
 }

 }

Voici le résultat que j'ai obtenu :
{1, 2, 3, 4}
{1, 2, 3, 4}
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7}

Voici le contenu de mon fichier : File.txt
1 2 3 4
1 2 3
1 2 4
5 6 7
5 7
5 6
Commenter la réponse de fatmanajjar
fatmanajjar 15 Messages postés dimanche 27 mai 2012Date d'inscription 8 juin 2017 Dernière intervention - Modifié par KX le 1/06/2017 à 07:02
0
Utile
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();
                        
                    }
                      
             }
    }
Commenter la réponse de fatmanajjar

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.