Necesito una ayuda para solucionar un problema con el Map:
lo he intentado de varias maneras y no doy con el método correcto, agradecería su ayuda;
Se usa una clase "Iterables2" para leer desde el archivo, usando sus métodos.
la clase Iterables2:
*******************************************************
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Scanner;
import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;
public class Iterables2 {
public static Iterable<String> from(String fileName) {
return new InputStreamSeq(fileName);
}
public static <T> Iterable<T> from(T[] array) {
return Arrays.asList(array);
}
/**
* Devuelve un Iterable<String> a partir de una cadena y unos
* delimitadores. Los delimitadores entran en forma de una String, en la que
* cada uno de los caracteres se considera un delimitador. El método elimina
* las cadenas vacías de la salida; elimina también los espacios en blanco
* delante y detrás de cada cadena devuelta.
*
* @param cadena
* @param delimitadores
* @return Iterable<String>
*/
public static Iterable<String> from(String cadena, String delimitadores) {
Splitter sp = Splitter.on(CharMatcher.anyOf(delimitadores));
sp.omitEmptyStrings().trimResults();
Iterable<String> it = sp.split(cadena);
return it;
}
/**
* Devuelve un Iterable<String> con las cadenas que se vayan
* introduciendo por el teclado terminadas con Enter, finalizando cuando se
* pulsa control+z. Las cadenas vacías no las devuelve en el momento: las
* devuelve todas juntas cuando se introduce una cadena no vacía.
*
* @return Iterable<String>
*/
public static Iterable<String> from() {
Iterable<String> it = new EntradaTeclado();
return it;
}
private static class EntradaTeclado implements Iterable<String> {
public EntradaTeclado() {
}
public Iterator<String> iterator() {
return new IteradorEntradaTeclado();
}
private class IteradorEntradaTeclado implements Iterator<String> {
private Scanner sc;
public IteradorEntradaTeclado() {
sc = new Scanner(System.in);
}
public boolean hasNext() {
return sc.hasNext();
}
public String next() {
String linea = sc.nextLine();
return linea;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
private static class InputStreamSeq implements Iterable<String> {
private String nf;
public InputStreamSeq(String f) {
nf = f;
}
public Iterator<String> iterator() {
return new InputStreamIterator();
}
public String toString() {
String result = "[";
String item = "";
for (Iterator<String> it = this.iterator(); it.hasNext();) {
item = it.next();
if (it.hasNext())
result += item + ", ";
else
result += item + "";
}
result += "]";
return result;
}
private class InputStreamIterator implements Iterator<String> {
private BufferedReader bf;
private String line;
public InputStreamIterator() {
try {
bf = new BufferedReader(new FileReader(nf));
line = bf.readLine();
} catch (IOException e) {
throw new IllegalArgumentException(
"No se puede acceder al fichero de entrada");
}
}
public boolean hasNext() {
return line != null;
}
public String next() {
if (!hasNext())
throw new NoSuchElementException();
String pal = line;
try {
line = bf.readLine();
} catch (IOException e) {
throw new IllegalArgumentException(
"No se puede acceder al fichero de entrada");
}
return pal;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
}
********************************************************************
y la clase principal es:
*******************************************************************
import com.google.common.collect.Ordering;
public class ClimaGroenlandiaImpl implements ClimaGroenlandia {
// TODO Apartado a
// Atributo:
private Map<String , List<Integer>> mapa, mapa1;
// El constructor crea el Map vacío
public ClimaGroenlandiaImpl(){
mapa = new HashMap<String , List<Integer>>();
mapa1 = new HashMap<String , List<Integer>>();
}
// TODO Apartado b
public void cargaFichero(String nombreFichero) {
// Creamos un Iterable<String> a partir del nombre de fichero con el
// método from con un argumento de Iterables2
// TODO
List<String> listaStr = new ArrayList<String>();
List<Integer> listaInt = new ArrayList<Integer>();
Iterable<String> lineas = Iterables2.from(nombreFichero);
// Iteramos sobre él
// TODO
for( String lineaEntera:lineas ){
Iterable<String> lineaPartida = Iterables2.from(lineaEntera, ",");
listaStr.clear();
listaInt.clear();
for( String elemLinea:lineaPartida ){
listaStr.add(elemLinea);
}//for segundo
String muni = listaStr.get(0);
listaStr.remove(0);
for( String s:listaStr ){
listaInt.add(Integer.parseInt(s));
}//for tercero
// System.out.println("Municipio: "+muni);
// System.out.println("lista de valores: "+listaInt);
//System.out.println("CARGANDO VALORES...........");
// mapa.put(muni, listaInt);
List<Integer> aux = new ArrayList<Integer>();
if( mapa.containsKey(muni) ){
// System.out.println("Ya existe el municipio......");
// aux.addAll(mapa.get(muni));
// System.out.println(muni+"------>"+aux);
// System.out.println(listaInt);
// aux.addAll(listaInt);
// mapa.put(muni, listaInt);
// System.out.println(mapa.get(muni));
}//if
else {
// System.out.println("Municipio Nuevo....");
mapa.put(muni, listaInt);
// System.out.println(mapa);
//mapa.get(muni).addAll(aux);
}//else
System.out.println(muni+" temperaturas: "+mapa.get(muni));
}//fin del for
System.out.println("===============================================");
Iterator it = mapa.entrySet().iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
System.out.println(e.getKey() + " " + e.getValue());
}
// Cada String devuelta es una línea del fichero. Ahora hay que
//partirla.
//Usamos el from de dos argumentos de Iterables2
// TODO
//Cada elemento de este Iterable<String> contiene cada uno de los
//componentes de la línea. Ahora hay que trasformar el Iterable en
//una lista.
//Para ello, creamos una lista
// TODO
// Iteramos sobre los elementos de la línea añadiendo sus
// elementos a la lista
// TODO
// El municipio será el primer elemento
// TODO
// Ahora se transforman el resto de los elementos de la línea, que
// son temperaturas, en enteros, guardándolos en otra lista.
// TODO
// El método estático parteInt de la clase Integer devuelve el
// valor como entero de una String
// Se insertan las temperaturas en el map, asociándolas con el
// municipio. Comprobamos si el municipio existía o no:
// TODO
// El municipio ya existía; se añaden las temperaturas a las que
// ya había
// TODO
// El municipio no existía; se crea un nuevo par municipio -
// temperaturas
// TODO
// }//el primer for //////////////////////////////////
}//fin del metodo
*******************************************************************
y el archivo de texto desde el que se lee es:
*********************************************************
Kujalleq,-12,-4,3,5,-20,-37
Qaasuitsup,-2,-14,3,4
Qeqqata,-19,-5,3,12,20,15,20,-34
Kujalleq,-26,-11,3,17,10,13,20,-31
Sermersooq,-42,-4,3,11,0,17,20,-14
Qaasuitsup,-19,-4,3,22,11,15,20,-23
Qeqqata,-33,-23,3,15,0,15,20,-40
Sermersooq,-40,-14,3,13,22,19,20,-50
*************************
Muchas gracias de antemano.