Эй, ребята, я пытался заставить мой код работать, но когда я запускаю его, на моем экране ничего не печатается. Я хотел бы, чтобы пользователь ввел код курса и затем получил название курса. Я хочу использовать HashMap, чтобы сделать это, однако после некоторой борьбы думал, что id спрашивает здесь некоторые предложения.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.*;
import java.io.*;

public class reading_a_file {

static void pull_info(String courseCode) throws IOException{

    BufferedReader read = new BufferedReader( new FileReader("CourseSample.txt"));

     Map<String, String> course_info = new HashMap<String, String>();

     String line;
    String[] data;

    while(((line = read.readLine()) != null))
   {
       line = read.readLine();
       data = line.split(" ");
       String courseID = data[0];
       String courseName = data[1];

       course_info.put(courseID, courseName);
       if(courseCode==courseID){
    System.out.println(course_info.get(courseName));
        }
    }

}

public static void main(String[] args) throws IOException{
    Scanner console = new Scanner (System.in);
    String course_code;

    System.out.println("--------------------------------------------------");
    System.out.println("Welcome to text file formatter by XM21");
    System.out.println("--------------------------------------------------");
    System.out.println("");
    System.out.println("Please enter course id to see description (-1 to exit):");
    System.out.println("CourseCode:");
    course_code = console.nextLine();


    pull_info(course_code);

}
}

И вот как выглядит мой текстовый файл: textfile

Образец текстового файла (просто скопируйте и вставьте в блокнот):

ITE221 Система управления базами данных

ITE222 Веб-разработка I Pre: ITE221 ITE232

ITE223 Облачные технологии Pre: ITE222

ITE224 Разработка мобильных приложений I Pre: ITE 222

3
Daniel Goncalves 3 Сен 2017 в 10:10

6 ответов

Лучший ответ

У вас есть несколько ошибок в этом коде, которые могут вызвать эту проблему.

1) Вы звоните line = read.nextLine() дважды подряд, поэтому смотрите только на каждую вторую строку.

2) В большинстве названий ваших курсов есть пробел - это означает, что даже если вам случится попасть на курс, который вы хотели во время поиска, вы напечатаете только первое слово из названия курса.

3) Строки должны сравниваться с равно или равно equalsIngnoreCase - не знак "==", который используется для других сравнений.

4) Сканеры - это ресурс - не забудьте закрыть его!

5) при печати значения Карты - используйте get (ключ) с ключом, а не со значением.

Вы можете улучшить код, изменив несколько вещей:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class reading_a_file {

  static void pull_info(String courseCode) throws IOException {

    BufferedReader read = new BufferedReader(new FileReader("CourseSample.txt"));

    Map<String, String> course_info = new HashMap<String, String>();

    String line;
    String[] data;

    while ((line = read.readLine()) != null) {
      data = line.split(" ");
      String courseID = data[0];
      String courseName = line.substring(line.indexOf(" ")+1);

      course_info.put(courseID, courseName);
      if (courseCode.equalsIgnoreCase(courseID)) {
        System.out.println(courseName);
      }
    }

  }

  public static void main(String[] args) throws IOException {

    Scanner console = new Scanner(System.in);
    String course_code;

    System.out.println("--------------------------------------------------");
    System.out.println("Welcome to text file formatter by XM21");
    System.out.println("--------------------------------------------------");
    System.out.println();
    System.out.println("Please enter course id to see description (-1 to exit):");
    System.out.println("CourseCode:");
    course_code = console.nextLine();

    pull_info(course_code);
    console.close();

  }
}
2
Assafs 3 Сен 2017 в 07:30

Используйте «courseCode.equals (courseID)» вместо «courseCode == courseID». «==» сравнивает ссылки и может использоваться для строковых литералов, а не для строк, созданных как «new String ()», вероятно, String.split () даст вам массив строк, созданный как «new String ()» для каждого слово. Будьте осторожны с регистром персонажа, когда кладете его на карту.

1
Ashok Prajapati 3 Сен 2017 в 07:24

Вы не можете сравнивать две String переменные с оператором ==, вы должны использовать equals().

Есть и другие ошибки, такие как «line = read.readLine ()» внутри цикла while и course_info.get(courseName), так как вы должны использовать ключ, чтобы получить значение в ваш HashMap, а не значение, чтобы получить ключ.

Отредактируйте свой блок так:

while ((line = read.readLine()) != null) {
   // line = read.readLine(); // no need for this
   data = line.split(" ");
   String courseID = data[0];
   String courseName = data[1];
   course_info.put(courseID, courseName);
   if (courseCode.equals(courseID)) { // correct comparation between String variables
        System.out.println(course_info.get(courseID)); // the hashmap retreives the right value now
    }
}

Редактировать

Если вы хотите вывести все строки после идентификатора, вам просто нужно добавить что-то действительно простое, например:

data = line.split(" ");
String courseID = data[0];

StringBuilder sb = new StringBuilder();

for (int i = 1; i < data.length; i++) {
    sb.append(data[i]);

    if (i < data.length - 1) {
        sb.append(" ");
    }
}

String courseName = sb.toString();
5
Domenico Ruggiano 4 Сен 2017 в 00:39

Помимо уже упомянутых проблем, вам, скорее всего, придется указать полный путь к файлу.

BufferedReader read = new BufferedReader( new FileReader("CourseSample.txt"));

Чтобы что-то вроде этого

BufferedReader br = new BufferedReader(new FileReader("Drive/Folder/User/Desktop/file.txt"));
1
Matt 3 Сен 2017 в 07:25

В вашем коде есть 3 основных проблемы.

1-й выпуск: -

Я вижу, вы поместили несколько readLine в ваш код

    while(((line = read.readLine()) != null))
   {
       line = read.readLine(); // No need for this.

2-й выпуск. - Вы должны использовать String равный метод

if(courseCode==courseID) // this is not good, as it's object comparsion.

Следующий код должен быть использован. Он будет сравнивать строковое значение.

 if( courseCode.equals(courseID))

3-й выпуск: - Вы не используете правильный ключ для получения элемента из hashmap. Используйте CourseID

    if (courseCode.equals(courseID)) {
        System.out.println(course_info.get(courseID));
    }

Это полная программа для вас. Это может быть оптимизировано в дальнейшем.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class reading_a_file {

    static void pull_info(String courseCode) throws IOException {

        BufferedReader read = new BufferedReader(new FileReader("CourseSample.txt"));

        Map<String, String> course_info = new HashMap<String, String>();

        String line;
        String[] data;


        while ((line = read.readLine()) != null) {
            data = line.split(" ");
            String courseID = data[0];
            String courseName = data[1];

            course_info.put(courseID, courseName);
            if (courseCode.equals(courseID)) {
                System.out.println(course_info.get(courseID));
            }
        }

    }

    public static void main(String[] args) throws IOException {
        Scanner console = new Scanner(System.in);
        String course_code;

        System.out.println("--------------------------------------------------");
        System.out.println("Welcome to text file formatter by XM21");
        System.out.println("--------------------------------------------------");
        System.out.println("");
        System.out.println("Please enter course id to see description (-1 to exit):");
        System.out.println("CourseCode:");
        course_code = console.nextLine();

        pull_info(course_code);

    }
}
3
nagendra547 3 Сен 2017 в 07:48

Не используйте оператор '==' для сравнения экземпляров String. Это только проверяет, имеют ли два экземпляра String одну и ту же ссылку. Замените '==' для метода equals ().

 courseID.equals(courseCode)
2
madtyn 3 Сен 2017 в 07:23