2014-09-07 4 views
0

Итак, у меня есть код У меня есть HashMap, составленный словами в файле, я добавляю слова и записываю их в файл, и это работает, но когда я использую функцию remove для некоторых reaseon не делает ничего здесь код:Удаление Java из HashMap и запись изменений в файл

import java.io.BufferedWriter; 
    import java.io.File; 
    import java.io.FileNotFoundException; 
    import java.io.FileWriter; 
    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.Scanner; 

    public class Main { 
    public static File file = new File(C:\\Users\\N\\Desktop\\Newfolder\\Dictionary\\src\\nmishewa\\geekycamp\\dictionary\\bg_win1251.txt"); 
public static int value = 1; 
private static Scanner input; 
public static Scanner in = new Scanner(System.in); 
public static Map<String, Integer> map = new HashMap<String, Integer>(); 

public static void main(String[] args) throws FileNotFoundException { 
    readFile(); 
    System.out.println("Enter number of function wanted" + "\n1 to add" 
      + "\n2 for searching by prefix" + "\n3 for deleting"); 
    int choice = in.nextInt(); 
    if (choice == 1) { 
     System.out.println("enter words seprated by comma"); 
     String wd = in.next(); 
     add(wd); 
    } 
    if (choice == 2) { 
     System.out.println("Enter prefix"); 
     String wd = in.next(); 
     prefixSearch(wd); 
    } 
    if (choice == 3) { 
     System.out.println("ENTER word to delete"); 
     String wd = in.next(); 
     remove(wd); 
    } 

} 

public static void readFile() throws FileNotFoundException { 
    input = new Scanner(file); 
    boolean done = false; 

    int value = 1; 

    while (input.hasNext()) { 
     String word = input.next().toLowerCase(); 
     String[] line = word.split("[,\\s]+"); 
     for (int j = 0; j < line.length; j++) { 
      map.put(line[j], value); 
      value++; 
      done = true; 
     } 
    } 
    if (done == true) { 
     System.out.println("Succes"); 
    } 
} 

public static void prefixSearch(String wd) { 
    System.out.println("Enter prefix"); 
    String prefix = wd.toLowerCase(); 
    for (Map.Entry<String, Integer> key : map.entrySet()) { 
     if (key.getKey().startsWith(prefix)) { 
      System.out.println(key.getKey()); 
     } 
    } 

} 

public static void add(String wd) { 
    boolean done = false; 
    String word = wd.toLowerCase(); 
    String[] line = word.split("[,\\s]+"); 
    for (int j = 0; j < line.length; j++) { 
     if (!map.containsKey(line[j])) { 
      map.put(line[j], value); 
      value++; 

      try { 
       FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
       BufferedWriter bw = new BufferedWriter(fw); 
       bw.write(map.toString()); 
       bw.close(); 
       done = true; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      continue; 
     } 
    } 

    if (done == true) { 
     System.out.println("Success"); 
    } 

} 

public static void remove(String wd) { 
    boolean done = false; 
    String word = wd.toLowerCase(); 
    String[] line = word.split("[,\\s]+"); 
    for (int j = 0; j < line.length; j++) { 
     for (Map.Entry<String, Integer> key : map.entrySet()) { 
      if (key.getKey().equals(line[j])) { 
       map.remove(key.getKey(), key.getValue()); 
       try { 
        FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
        BufferedWriter bw = new BufferedWriter(fw); 
        bw.write(map.toString()); 
        bw.close(); 
        done = true; 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } else { 
       continue; 
      } 
     } 

    } 
    if (done == true) { 
     System.out.println("Succes"); 
    } 

} 

}

Любой другой метод работает нормально, но удалить. Что-то не так с петлями, может быть, использовать более оптимальный способ или?

+0

Почему вы проходите через все записи в 'map'. также 'map.remove' принимает только один параметр, который является ключом. вы можете попробовать использовать что-то вроде этого 'if (map.containsKey (строка [j])) { \t \t \t map.remove (line [j]); ....} 'вместо цикла' for'. – Tapos

+0

Кстати, можете ли вы также разместить образец содержимого файла. – Tapos

ответ

0

Причина отказа заключается в том, что вы пытаетесь изменить карту при повторении записей. Как и в любой коллекции - если вы попытаетесь изменить ее при повторении, вы получите ConcurrentModificationException.

Кроме того, существует избыточный внутренний цикл (избыточно, потому что вся цель карты состоит в том, что вам не придется повторять ее, когда вы ищете определенное значение/с), что означает, что вы будете попробуйте переопределить файл много раз, когда достаточно одного раза.

public static void remove(String wd) { 
    boolean done = false; 
    String word = wd.toLowerCase(); 
    String[] line = word.split("[,\\s]+"); 
    for (int j = 0; j < line.length; j++) { 
     map.remove(line[j]); 
    } 
    try { 
     FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
     BufferedWriter bw = new BufferedWriter(fw); 
     bw.write(map.toString()); 
     bw.close(); 
     done = true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if (done == true) { 
     System.out.println("Success"); 
    } 
} 
+0

Это помогло много спасибо)) – 2014-09-07 21:52:44

0

Вопросы, которые я могу видеть в коде, являются следующие:

  1. Вы забыли цитату при определении файла:

    public static File file = new File(C:\\Users\\N\\Desktop\\Newfolder\\Dictionary\\src\\nmishewa\\geekycamp\\dictionary\\bg_win1251.txt")

должно быть:

public static File file = new File("C:\\Users\\N\\Desktop\\Newfolder\\Dictionary\\src\\nmishewa\\geekycamp\\dictionary\\bg_win1251.txt"); 
  1. Функция удаления() в карте принимает только один параметр, который является ключом записи, которую вы хотите удалить, так:

    map.remove(key.getKey(), key.getValue());

должно быть:

map.remove(key.getKey()); 

Кроме того, поскольку вы получаете запись на своей карте, возможно, вам стоит рассмотреть переименование переменной key в функции rename() на entry.

Смежные вопросы