Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2017, 10:15   #1
Str-137
Новичок
Джуниор
 
Регистрация: 13.11.2017
Сообщений: 4
По умолчанию Работа с файлами

Всем добрый день!
Есть задача:
В файле, содержащем фамилии студентов и их оценки, записать прописными буквами фамилии тех студентов, которые имеют средний балл более “7”.

С файла я считал
Код:
/* Чтение строки */
		
			 try (BufferedReader reader = new BufferedReader(new FileReader("D://test.txt")))  {
			    String value = reader.readLine();
			    
			/*Добавление элемента в массив  */
			  ArrayList <String> list = new ArrayList <String>();
			    list.add(value);
			    System.out.println ("Первый элемент массива '" + list.get(0) + "'");
			//  System.out.println ("Первый элемент массива '" + list.get(1) + "'");
			//System.out.println ("Размер массива '" + Integer.valueOf (list.size()) + "'");
Результат: Первый элемент массива 'Иванов Иван 5,6,5,3,5,9,4'
Далее, отсортировав буквы от чисел
Код:
/*      */
			    String arr = value;
			    String[] items = arr.replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\s", "").split(",");

			    int[] results = new int[items.length];

			    for (int i = 0; i < items.length; i++) {
			        try {
			            results[i] = Integer.parseInt(items[i]);
			            System.out.print ("results[i] '" + results[i] + "'");
			       
			            
			        } catch (NumberFormatException nfe) {
			            //NOTE: write something here if you need to recover from formatting errors
			        };
			    }
			    
			    /*     */
Результат: results[i] '6'results[i] '5'results[i] '3'results[i] '5'results[i] '9'results[i] '4'
Побывал и по другому
Код:
/* Все строки файла засунуты в массив*/
				  
					String str_1 = linesAsArray[j];
			           String str_2 = linesAsArray[j];
						str_1 = str_1.replaceAll("[^0-9]+", "");
						str_2 = str_2.replaceAll("[^а-яА-Яa-zA-Z]", "");

				    	char [] c = str_1.toCharArray ();
						double average = 0;
				    	if (c.length > 0)
				    	{
				    		 System.out.println(" c.length "+ c.length);
				    	    double sum = 0;
				    	    for (int j1 = 0; j1 < c.length; j1++) {
				    	         sum += c[j1];
				    	    }
				    	    average = (sum / c.length);
				    	    
				    	    System.out.println("average "+ average);
				    	    System.out.println("c.length "+ c.length);
				    	    System.out.println("sum "+ sum);
				    	    System.out.println("c[0] "+ c[0]);
				    	    System.out.println("c[1] "+ c[1]);
				    	    System.out.println("c[2] "+ c[2]);
				    	    System.out.println("c[3] "+ c[3]);
				    	    System.out.println("c[4] "+ c[4]);
				    	    System.out.println("c[5] "+ c[5]);
				    	    System.out.println("c[5] + c[4] "+ c[5] + c[4]);
				    	}
average 53.285714285714285
c.length 7
sum 373.0
c[0] 5
c[1] 6
c[2] 5
c[3] 3
c[4] 5
c[5] 9
c[5] + c[4] 95
И так
Код:
 ArrayList<String[]> allArrays = new ArrayList<String[]>();  
			    allArrays.add(names);
			   allArrays.add(values);
			    for (String a[]:allArrays){
			        for (String b:a){
			      System.out.println("allArrays "+b);
Результат:allArrays 5653594
allArrays ИвановИван
Короче с задачей не справился
Подскажите где выход
Str-137 вне форума Ответить с цитированием
Старый 13.11.2017, 14:00   #2
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

Для начала опишите точный формат файла с данными, а то вы пишите "В файле, содержащем фамилии студентов и их оценки" и тут же в вашем примере мелькает имя "Результат: Первый элемент массива 'Иванов Иван 5,6,5,3,5,9,4'"
ultimatet41 вне форума Ответить с цитированием
Старый 13.11.2017, 14:25   #3
Str-137
Новичок
Джуниор
 
Регистрация: 13.11.2017
Сообщений: 4
По умолчанию

Формат документа txt
Иванов Иван 5,5,3,6,2,3
ПетровИван 5,5,3,6,2,3
итд
Str-137 вне форума Ответить с цитированием
Старый 13.11.2017, 14:27   #4
Str-137
Новичок
Джуниор
 
Регистрация: 13.11.2017
Сообщений: 4
По умолчанию

ошибка в этом фрагменте кода
Цитата:
Сообщение от Str-137 Посмотреть сообщение
double sum = 0;
for (int j1 = 0; j1 < c.length; j1++) {
sum += c[j1];
}
неправильно сумму считает, я не могу понять как?
Str-137 вне форума Ответить с цитированием
Старый 14.11.2017, 08:34   #5
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

Парсер и обработчик
Код:
import java.io.*;
import java.util.ArrayList;

public class Parser {

    public static void main(String[] args) throws IOException {
        Parser parser = new Parser();
        System.out.print("Введите адрес файла: ");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        parser.readDateAndParse(reader.readLine());
        System.out.print("Введите значение отбора: ");
        parser.getStudentFromRating(Integer.parseInt(reader.readLine()));
        reader.close();
    }

    public void readDateAndParse(String fileName) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
        String str;
        while ((str = reader.readLine()) != null) {
            String str1[] = str.split(" ");
            String rt[] = str1[str1.length - 1].split(",");
            Student student = new Student();
            student.setFirstName(str1[0]);
            student.setLastName(str1[1]);
            student.addRating(rt);
            students.add(student);
        }
        reader.close();
    }

    public void getStudentFromRating(int rating) {
        for (Student s : students) {
            int sum = 0;
            for (Integer i : s.getRating()) {
                sum += i;
            }
            if ((sum / s.getRating().size()) >= rating) {
                System.out.println(s);
            }
        }
    }

    private ArrayList<Student> students = new ArrayList<>();
}

сущность студент
Код:
import java.util.ArrayList;
import java.util.Arrays;

public class Student {

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public ArrayList<Integer> getRating() {
        return ratings;
    }

    public boolean addRating(String r[]) {
        try {
            for (String str :  r)
            ratings.add(Integer.parseInt(str));
        }
        catch (NumberFormatException e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

    @Override
    public String toString() {
        return
                firstName + '\'' +
                " " + lastName + '\'' +
                " " + Arrays.toString(ratings.toArray());
    }

    private String firstName;
    private String lastName;
    private ArrayList<Integer> ratings = new ArrayList<>();
}
Формат файла. При нарушение формата будут ошибки в работе программы
Код:
firstname lastname rations1,rations2,rations3
Содержимое файла на котором тестировалось
Код:
Иванов Иван 7,7,7,8,9,8
Костылин Иван 5,5,3,6,4,3
ultimatet41 вне форума Ответить с цитированием
Старый 15.11.2017, 07:52   #6
Str-137
Новичок
Джуниор
 
Регистрация: 13.11.2017
Сообщений: 4
По умолчанию

Спасибо, но у меня есть такой вариант
String s = linesAsArray[j];
Pattern p = Pattern.compile("((\\d+,?)+)");
Matcher m = p.matcher(s);//Объект «Искатель» является двигателем, который
//интерпретирует шаблон и выполняет операции сопоставления с входной строкой.
if (!m.find()) {// m.find () возвращает true, если шаблон совпадает с любой частью текста.
throw new IllegalArgumentException("Illegal string format");
}
int position = m.start();//вернет индекс первого символа, совпавшего
String name = s.substring(0, position).trim();//возвращает новую строку, которая является подстрокой данной строки.
/*OptionalDouble Объект контейнера, который может содержать или не содержать double значение*/

OptionalDouble average = Arrays.stream(s.substring(position) .split(",\\s*"))

// .filter(StringUtils::isNumeric)
.map(Integer:arseInt).
mapToInt(Integer::intValue).
average();
average.ifPresent(avg -> System.out.println(name + " : " + avg));

System.out.println(name + " : " + average);
Str-137 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабораторная работа(очень простая) Структуры, работа с файлами yurda Фриланс 2 11.06.2016 08:44
Работа с файлами в с++. bilbo Помощь студентам 3 17.09.2014 09:35
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
Работа с файлами. GoodNight Помощь студентам 7 22.12.2012 19:22
Работа с файлами sancheszone Паскаль, Turbo Pascal, PascalABC.NET 4 11.11.2009 14:21