Mam bardzo nietypowy problem.
Zasadniczo próbuję uzyskać wartość skojarzoną z kluczem z mapy ciągów znaków do ciągów.
Wiem, że klucz, którego używam, jest obecny; Używam tego samego ciągu, który użyłem do jego wstawienia!Java Map zwraca wartość null dla klucza bieżącego
mam instrukcje print całym moim kodu, a to jest sprawa mam ...
Oto mój słownik characterDictionary
{thusChar=∴, spaceChar= , plusChar=+, equalsIndent=#, multiplyChar=×, equalsChar==, newlineChar=\n, divideChar=÷, subjectChar=:, [email protected]}
Ostatnim kluczowym „variableIndent” jest kłopot!
Oto kod ...
System.out.println ( characterDictionary.get("variableIndent"));
który niewłaściwie wyjść: null
Sprawdziłem, podwójne i potrójne sprawdzone sprawdzone mojego kodu.
Nie ma absolutnie żadnej różnicy między kluczowego „variableIndent” i argument string characterDictionary.get("variableIndent")
, ale to zachowuje się tak, jakby ten klucz nie był obecny.
Mogę bezwzględnie zagwarantować, że ten klucz jest obecny i że oba ciągi są identyczne.
Wszystkie pozostałe elementy (te, które sprawdziłem, około 3 dotychczas) ze słownika są pobierane jak zwykle. Dlaczego "variableIndent" ma wartość "@"?
Możesz zauważyć, że słownik zawiera znaki inne niż ASCII, np. "ThusChar". Czy to może być powiązane?
Dzięki
(To wydaje się bardzo prosty i banalny problem, jakby Zrobiłem trochę żałośnie głupi błąd, ale jeszcze nie mogę go rozwiązać!)
EDIT:
Okej, to musi być coś o kodowaniu.
Wziąłem klucz łańcucha ze słownika i porównałem go z argumentem get.
Po wydrukowaniu są identyczne, ale java mówi, że nie są równe.
Kluczowy ciąg pochodzi z zakodowanego pliku tekstowego UTF-8, podczas gdy ciąg argumentów pochodzi z dosłownego Eclipse języka Java.
Jednak znaki są identyczne.
Na czym polega problem i jak mogę go rozwiązać?
Dzięki!
EDIT:
Hmmm, tutaj jest to, co faktycznie dzieje się za kulisami.
Mam plik tekstowy UTF-8, który zawiera następujące treści ...
variableIndent,@
equalsIndent,#
spaceChar,
newlineChar,\n
multiplyChar,×
divideChar,÷
plusChar,+
equalsChar,=
subjectChar,:
thusChar,∴
ja „obciążenie” ten plik czytając w każdym wierszu pliku jako element ArrayList<String>
, przekazując katalog pliku:
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; }
Wszystko jest w porządku, nawet tutaj.
Następnie przekazuję tę tablicę ArrayList do funkcji, która dzieli każdy element przez znak "," (przy użyciu funkcji z osobistego pakietu, to zdecydowanie nie jest problem) i dodaje pierwszą część jako klucz do drugiego w nowy słownik.
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; }
To powoduje, że słownik powoduje wszystkie problemy.
Mam zestaw literałów kluczowych, które odpowiadają nazwom postaci w plikach tekstowych, których używam, aby uzyskać dostęp do słownika w programie.
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";
tutaj jest problem:
górna linia tekstowego 'śruby w górę' w słowniku. Został dodany do słownika i poprawnie wyświetla się w zestawie kluczy i drukowanym formacie słownika, ale próba dostępu do niego zwraca "null".
(W tym przypadku, to variableIndent. Jeśli mogę umieścić variableIndent gdzieś w pliku tekstowym, equalsIndent śruby do góry, etc)
Co się dzieje !?
Czy mam podejrzaną funkcję ?!
Sprawdzili się dobrze we wszystkim innym.
Dzięki!
W celu zagwarantowania, że ten klucz jest obecny, iteracyjne nad wszystkie klucze w tej mapie i wydrukować swoją wartość. –
Czy możesz pokazać niektóre, które odtwarzają zachowanie? – assylias
edytował OP. Wierzcie, że jest to problem z kodowaniem między plikiem tekstowym a Eclipse. –