Tengo un problema muy inusual.
Básicamente, estoy tratando de obtener el valor asociado con una clave desde un Mapa de Cadenas a Cadenas.
Sé que la clave que estoy usando está presente; ¡Estoy usando la misma cadena que usé para ponerlo!Java Map devuelve nulo para una clave actual
tengo instrucciones de impresión de todo mi código, y este es el caso que tengo ...
Aquí es mi diccionario characterDictionary
{thusChar=∴, spaceChar= , plusChar=+, equalsIndent=#, multiplyChar=×, equalsChar==, newlineChar=\n, divideChar=÷, subjectChar=:, [email protected]}
La última tecla "variableIndent" es la ¡problema!
Aquí está el código ...
System.out.println ( characterDictionary.get("variableIndent"));
cual inapropiadamente salidas: null
He comprobado, verificado doble y el triple comprobado mi código.
no hay absolutamente ninguna diferencia entre la clave "variableIndent" y el argumento de cadena de characterDictionary.get("variableIndent")
, sin embargo, se comporta como si esta clave no estaba presente.
Puedo garantizar que esta clave está presente, y que las dos cadenas son idénticas.
Todos los demás elementos (los que he comprobado, aproximadamente 3 hasta el momento) del diccionario se recuperan de forma normal. ¿Por qué está "variableIndent" con su valor "@" activo?
Es posible que observe que el diccionario no contiene caracteres ASCII, como "thusChar". ¿Podría esto estar relacionado?
Gracias
(Este parece ser un problema muy simple y trivial, como si yo he cometido un error lamentable tonto, pero sin embargo, yo simplemente no puede resolverlo!)
EDIT:
Bueno, esto tiene que ser algo sobre la codificación.
Cogí la clave de cadena del diccionario y la comparé con mi argumento get.
Cuando se imprimen, son idénticos, pero Java dice que no son iguales.
La cadena de clave provino de un archivo de texto codificado en UTF-8, mientras que la cadena de argumento proviene de un literal de Eclipse de Java.
Sin embargo, los caracteres son idénticos.
¿Cuál es el problema y cómo puedo resolverlo?
Gracias!
EDIT:
Hmmm, esto es lo que realmente está sucediendo detrás de las escenas.
Tengo un archivo de texto UTF-8 que contiene el siguiente contenido ...
variableIndent,@
equalsIndent,#
spaceChar,
newlineChar,\n
multiplyChar,×
divideChar,÷
plusChar,+
equalsChar,=
subjectChar,:
thusChar,∴
I 'carga' este archivo mediante la lectura en cada línea del archivo como un elemento ArrayList<String>
, pasando el directorio del archivo:
private static ArrayList<String> readLinesFile(String ResourceFile) {
ArrayList<String> Lines = new ArrayList<String>();
try{
InputStream fstream = FileManager.class.getResourceAsStream(ResourceFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null) {
Lines.add(strLine); }
in.close(); }
catch (Exception e) {
System.out.println("Error: " + e.getMessage()); }
return Lines; }
todo está bien hasta aquí.
Luego transfiero este ArrayList a una función que divide cada elemento por el carácter "," (usando una función de un paquete personal; definitivamente no es el problema) y agrega la primera parte como clave para el segundo el nuevo diccionario.
private static Map<String, String> generateBaseUnits_Characters_Prefixes(ArrayList<String> FileContent) {
Map<String, String> BaseUnitsCache = new HashMap<String, String>();
ArrayList<String> currentLine;
for (int i=0; i<FileContent.size(); i++) {
currentLine = MiscellaneousFunctions.splitString(FileContent.get(i), ",");
BaseUnitsCache.put(currentLine.get(0), currentLine.get(1)); }
return BaseUnitsCache; }
y esto produce el diccionario que está causando todos los problemas.
Tengo un conjunto de Key Literals que corresponden a los nombres de los caracteres en los archivos de texto, que utilizo para acceder al diccionario en el programa.
public static String variableIndentKey = "variableIndent";
public static String equalsIndentKey = "equalsIndent";
public static String spaceCharKey = "spaceChar";
public static String newlineCharKey = "newlineChar";
public static String multiplyCharKey = "multiplyChar";
public static String divideCharKey = "divideChar";
public static String plusCharKey = "plusChar";
public static String equalsCharKey = "equalsChar";
public static String subjectCharKey = "subjectChar";
public static String thusCharKey = "thusChar";
está aquí el problema:
La línea superior del archivo de texto '' mete la pata en el diccionario. Se agrega al diccionario y aparece correctamente entre keySet y el formato impreso del diccionario, pero al intentar acceder se devuelve "nulo".
(En este caso, es variableIndent. Si pongo VariableIndent en otro lugar en el archivo de texto, igualInstala tornillos, etc.)
¡¿Qué está pasando ?!
¿Tengo una función dudosa ?!
Han funcionado bien para todo lo demás.
Gracias!
Para garantizar que esta clave está presente, iterar sobre todas las llaves en este mapa e imprimir su valor. –
¿Puedes mostrar alguno que reproduzca el comportamiento? – assylias
editó el OP. Creo que es un problema de codificación entre un archivo de texto y Eclipse. –