PDA

View Full Version : [java] Wrapper per convertire un booleano in un numero


Solido
10-01-2012, 15:43
Salve ragazzi devo fare un programmino di intelligenza artificiale che prende in input un file formato arff per poi lavorarci sopra.
Per chi non lo sapesse tale file è una sorta di tab excel con un header e al suo interno sotto il nome di ogni attributo ha il valore di istanza TRUE o FALSE...
il problema è che questo troiaio lo prendo in input ed è quindi difficile gestirlo... pensavo quindi di trasformare questi attributi booleani in numerici per poi trattare il file come fosse una matrice...

Qualcuno mi sa aiutare?
Grazie mille in anticipo!!!:)

Solido
26-01-2012, 10:59
Ragazzi chiedo aiuto per la gestione di questo file...
io mi trovo di fronte ad un file con intestazione, che devo saltare, dopo di che devo analizzare il contenuto. Questo consta di una seri di colonne le quali hanno vari attributi che possono essere numerici come stringhe come booleani. Io devo prendere tutti questi attributi e trasformali in numerici e splittare sulle virgole. In sostanza quello che voglio è che il file mi si trasformi in una matrice numerica da gestire poi in modo normale... qualcuno mi sa dare una mano???
Grazie

GByTe87
26-01-2012, 11:49
Idea di massima:

import java.io.*;

class FileRead {
public static void main(String args[]) {

try {

FileInputStream fstream = new FileInputStream("asd.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

String strLine;
int lineNumber = 0;

int array[] = new int[100];

while ((strLine = br.readLine()) != null) {

if (lineNumber++ == 0)
continue;

String[] stringArray = strLine.split(",");

for (int i = 0; i < stringArray.length; ++i){
array[i] = Integer.parseInt(stringArray[i]);
System.out.println(i + ":" + array[i]);
}

}
in.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}


L'ho scritta al volo partendo da questo esempio (http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml), ovviamente si basa sul fatto che tutti i valori contenuti nel file siano int.
Devi modificarlo in modo che gestisca la memorizzazione nella tua matrice finale.

Solido
26-01-2012, 12:07
Idea di massima:

import java.io.*;

class FileRead {
public static void main(String args[]) {

try {

FileInputStream fstream = new FileInputStream("asd.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

String strLine;
int lineNumber = 0;

int array[] = new int[100];

while ((strLine = br.readLine()) != null) {

if (lineNumber++ == 0)
continue;

String[] stringArray = strLine.split(",");

for (int i = 0; i < stringArray.length; ++i){
array[i] = Integer.parseInt(stringArray[i]);
System.out.println(i + ":" + array[i]);
}

}
in.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}


L'ho scritta al volo partendo da questo esempio (http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml), ovviamente si basa sul fatto che tutti i valori contenuti nel file siano int.
Devi modificarlo in modo che gestisca la memorizzazione nella tua matrice finale.



Innanzi tutto grazie mille...siccome sono veramente niubbo in java e mi è stato dato un progetto per me difficile ti chiedo ancora aiuto...
ti posto il file:

@relation zoo

@attribute animal {aardvark,antelope,bass,bear,boar,buffalo,calf,carp,catfish,cavy,cheetah,chicken,chub,clam,crab,crayfish,crow,deer,dogfish,dolphin,dove,duck,elephant,flamingo,flea,frog,fruitbat,giraffe,girl,gnat,goat,gorilla,gull,haddock,hamster,hare,hawk,herring,honeybee,housefly,kiwi,ladybird,lark,leopard,lion,lobster,lynx,mink,mole,mongoose,moth,newt,octopus,opossum,oryx,ostrich,parakeet,penguin,pheasant,pike,piranha,pitviper,platypus,polecat,pony,porpoise,puma,pussycat,raccoon,reindeer,rhea,scorpion,seahorse,seal,sealion,seasnake,seawasp,skimmer,skua,slowworm,slug,sole,sparrow,squirrel,starfish,stingray,swan,termite,toad,tortoise,tuatara,tuna,vampire,vole,vulture,wallaby,wasp,wolf,worm,wren}
@attribute hair {false,true}
@attribute feathers {false,true}
@attribute eggs {false,true}
@attribute milk {false,true}
@attribute airborne {false,true}
@attribute aquatic {false,true}
@attribute predator {false,true}
@attribute toothed {false,true}
@attribute backbone {false,true}
@attribute breathes {false,true}
@attribute venomous {false,true}
@attribute fins {false,true}
@attribute legs numeric
@attribute tail {false,true}
@attribute domestic {false,true}
@attribute catsize {false,true}
@attribute type {mammal,bird,reptile,fish,amphibian,insect,invertebrate}

@data
aardvark,true,false,false,true,false,false,true,true,true,true,false,false,4,false,false,true,mammal
antelope,true,false,false,true,false,false,false,true,true,true,false,false,4,true,false,true,mammal
bass,false,false,true,false,false,true,true,true,true,false,false,true,0,true,false,false,fish
bear,true,false,false,true,false,false,true,true,true,true,false,false,4,false,false,true,mammal
boar,true,false,false,true,false,false,true,true,true,true,false,false,4,true,false,true,mammal
buffalo,true,false,false,true,false,false,false,true,true,true,false,false,4,true,false,true,mammal
calf,true,false,false,true,false,false,false,true,true,true,false,false,4,true,true,true,mammal
carp,false,false,true,false,false,true,false,true,true,false,false,true,0,true,true,false,fish
catfish,false,false,true,false,false,true,true,true,true,false,false,true,0,true,false,false,fish
cavy,true,false,false,true,false,false,false,true,true,true,false,false,4,false,true,false,mammal
cheetah,true,false,false,true,false,false,true,true,true,true,false,false,4,true,false,true,mammal
chicken,false,true,true,false,true,false,false,false,true,true,false,false,2,true,true,false,bird
chub,false,false,true,false,false,true,true,true,true,false,false,true,0,true,false,false,fish
clam,false,false,true,false,false,false,true,false,false,false,false,false,0,false,false,false,invertebrate
crab,false,false,true,false,false,true,true,false,false,false,false,false,4,false,false,false,invertebrate
crayfish,false,false,true,false,false,true,true,false,false,false,false,false,6,false,false,false,invertebrate
crow,false,true,true,false,true,false,true,false,true,true,false,false,2,true,false,false,bird
deer,true,false,false,true,false,false,false,true,true,true,false,false,4,true,false,true,mammal
dogfish,false,false,true,false,false,true,true,true,true,false,false,true,0,true,false,true,fish
dolphin,false,false,false,true,false,true,true,true,true,true,false,true,0,true,false,true,mammal
dove,false,true,true,false,true,false,false,false,true,true,false,false,2,true,true,false,bird
duck,false,true,true,false,true,true,false,false,true,true,false,false,2,true,false,false,bird
elephant,true,false,false,true,false,false,false,true,true,true,false,false,4,true,false,true,mammal
flamingo,false,true,true,false,true,false,false,false,true,true,false,false,2,true,false,true,bird
flea,false,false,true,false,false,false,false,false,false,true,false,false,6,false,false,false,insect
frog,false,false,true,false,false,true,true,true,true,true,false,false,4,false,false,false,amphibian
frog,false,false,true,false,false,true,true,true,true,true,true,false,4,false,false,false,amphibian
fruitbat,true,false,false,true,true,false,false,true,true,true,false,false,2,true,false,false,mammal
giraffe,true,false,false,true,false,false,false,true,true,true,false,false,4,true,false,true,mammal
girl,true,false,false,true,false,false,true,true,true,true,false,false,2,false,true,true,mammal
gnat,false,false,true,false,true,false,false,false,false,true,false,false,6,false,false,false,insect
goat,true,false,false,true,false,false,false,true,true,true,false,false,4,true,true,true,mammal
gorilla,true,false,false,true,false,false,false,true,true,true,false,false,2,false,false,true,mammal


io praticamente devo mettere questo coso in una matrice numerica per poi mandarla in input ad un alg di apprendimento che poi mi dia delle predizioni se gli inserisco un input sconosciuto.
i miei file txt si trovano in src

e il troiaio di codice mio era questo:


import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


public class reader {


public reader() throws IOException{

FileReader fileReader = new FileReader("src/zoo.txt");
BufferedReader fileBufereReader = new BufferedReader(fileReader );
ArrayList<String> blah = new ArrayList<String>();

String s = fileBufereReader .readLine();

while(s!=null){
blah.add(s);
s = fileBufereReader .readLine();
String[] array= s.split(",");
for (int i=0; i<array.length; i++){
System.out.println("\n" + array[i]);
}
}

non so se mi sono spiegato...:stordita:

Solido
26-01-2012, 12:13
ah...ho continuato la programmazione a bestia :

while(s!=null){
blah.add(s);
s = fileBufereReader .readLine();
String[] array= s.split(",");
for (int i=0; i<array.length; i++){
if (array[i].equals("true")){
array[i]="1";
}
else if (array[i].equals("false")){
array[i]="0";
}
System.out.println("\n" + array[i]);
}
}

ora mi sostituisco i true e i false :D

GByTe87
26-01-2012, 12:16
Più tardi butto un'occhio, al volo però ti consiglio di usare sempre le funzioni già messe a disposizione dalla libreria per le conversioni.

Es, per passare da String a boolean... http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Boolean.html#valueOf%28java.lang.String%29

Solido
26-01-2012, 12:34
ok grazie mille cmq a me nella fattispecie non mi serve passare da stringa a booleano quanto a numerico!
Sai se avessi solo file con true e false basterebbe un if come ho messo ma ho anche altri valori numerici che devono restare tali poi devo gestire i nomi, devono essere trasformati in numeri pure loro, o anche altri caratteri ascii:mc:

GByTe87
26-01-2012, 12:37
ok grazie mille cmq a me nella fattispecie non mi serve passare da stringa a booleano quanto a numerico!
Sai se avessi solo file con true e false basterebbe un if come ho messo ma ho anche altri valori numerici che devono restare tali poi devo gestire i nomi, devono essere trasformati in numeri pure loro, o anche altri caratteri ascii:mc:

Capisco, un noioso bagno di sangue. :D

wingman87
26-01-2012, 20:41
Se ho capito bene il problema, potresti creare una tabella dei simboli.
Se vuoi che true e false valgano 1 e 0 li inserisci preventivamente nella tabella, quindi:
"false" -> 0
"true" -> 1
dopodiché leggi tutti i tuoi token (quindi numeri o parole e non so cos'altro) e se sono già presenti nella tabella, la interroghi e li traduci in numero, altrimenti gli assegni un numero progressivo e li inserisci in tabella.
Esempio, ho i seguenti token e la tabella di sopra:
animal,aardvark,true,animal
- animal non è in tabella, lo inserisco con numero 2 e lo traduco in 2
- aardvark non è in tabella, lo inserisco con numero 3 e lo traduco in 3
- true è in tabella, lo traduco in 1
- animal è in tabella, lo traduco in 2
- risultato: 2,3,1,2

Questo a grandi linee... forse i numeri dovranno restare tali, quindi dovrai stare attento a che non ci siano 2 simboli (una parola ed un numero) con assegnato lo stesso valore

ndakota
26-01-2012, 21:19
Stai usando questo metodo? Forse potrebbe esserti utile

http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html#parseBoolean(java.lang.String)

Solido
27-01-2012, 13:14
Se ho capito bene il problema, potresti creare una tabella dei simboli.
Se vuoi che true e false valgano 1 e 0 li inserisci preventivamente nella tabella, quindi:
"false" -> 0
"true" -> 1
dopodiché leggi tutti i tuoi token (quindi numeri o parole e non so cos'altro) e se sono già presenti nella tabella, la interroghi e li traduci in numero, altrimenti gli assegni un numero progressivo e li inserisci in tabella.
Esempio, ho i seguenti token e la tabella di sopra:
animal,aardvark,true,animal
- animal non è in tabella, lo inserisco con numero 2 e lo traduco in 2
- aardvark non è in tabella, lo inserisco con numero 3 e lo traduco in 3
- true è in tabella, lo traduco in 1
- animal è in tabella, lo traduco in 2
- risultato: 2,3,1,2

Questo a grandi linee... forse i numeri dovranno restare tali, quindi dovrai stare attento a che non ci siano 2 simboli (una parola ed un numero) con assegnato lo stesso valore

Ciao grazie mille... avevo pensato anche io a questa soluzione...
però non saprei come partire... sai che classi e metodi usare?
come si aggiungono i valori alla tabella?
grazie mille

wingman87
27-01-2012, 13:51
Per la tabella userei una HashMap<String, Integer>, oppure un'altra implementazione di Map.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Map.html
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html

Per il resto non so a quali problemi potresti andare incontro, inizia a scrivere qualcosa e vediamo...

Solido
27-01-2012, 18:29
Per la tabella userei una HashMap<String, Integer>, oppure un'altra implementazione di Map.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Map.html
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html

Per il resto non so a quali problemi potresti andare incontro, inizia a scrivere qualcosa e vediamo...

quindi poichè io ho tutto il file in s con un for metto tutti i token dentro la mia tabella incrementando un indice che mi scorre il file?