package com.javarush.task.task18.task1828;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/*
Прайсы 2
*/
public class Solution {
static List<String> fileContent;
public static void main(String[] args) throws Exception
{
if (!isCorrectArguments(args)) return;
fileContent = new ArrayList<>();
String filename = getFileName();
readFromFile(filename);
System.out.println("initial file");
printFileContent();
switch (args[0])
{
case "-u" :
updateLine(args);
break;
case "-d" :
deleteLine(args[1]);
break;
}
System.out.println("final file");
printFileContent();
writeToFile(filename);
}
public static boolean isCorrectArguments(String[] args)
{
return args.length > 0 && (args[0].equals("-u") || args[0].equals("-d"));
}
public static String getFileName() throws IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String filename = reader.readLine();
//String filename = "d:/tmp/price.txt";
reader.close();
return filename;
}
public static void readFromFile(String filename) throws FileNotFoundException, IOException
{
BufferedReader reader = new BufferedReader(new FileReader(filename));
String lineOfFile = "";
while ( (lineOfFile = reader.readLine()) != null)
{
fileContent.add(lineOfFile);
}
reader.close();
}
public static void clearFile(String filename) throws IOException
{
BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
writer.write("");
writer.close();
}
public static void writeToFile(String filename) throws IOException
{
if (fileContent.size() > 0)
{
clearFile(filename);
BufferedWriter writer = new BufferedWriter(new FileWriter(filename, true));
for (int i = 0; i < fileContent.size(); i++)
{
writer.write(fileContent.get(i));
if ( i < fileContent.size()-1 )
writer.newLine();
}
writer.close();
}
}
public static void printFileContent()
{
fileContent.forEach( value -> System.out.println("row= " + value));
}
private static void updateLine(String[] newLine) // поступит args
{
String line = formString(newLine);
int index = getIndex(newLine[1]);
fileContent.set(index, line);
}
public static void deleteLine(String lineId) // поступит args[1]
{
int index = getIndex(lineId);
fileContent.remove(index);
}
public static int getIndex(String lineId)
{
int index = 0;
String id = lineId.length() > 8 ? lineId.substring(0, 8) : lineId;
while(lineId.length() < 8)
lineId += " ";
for (int i = 0; i < fileContent.size(); i++) {
if (fileContent.get(i).startsWith(id) )
{
index = i;
break;
}
}
return index;
}
public static String formString(String[] table)
{
String id = getString(table[1], 8);
String productId = "";
for (int i = 2; i < table.length-2; i++) {
productId += table[i] + " ";
}
productId = getString(productId, 30);
String price = getString(table[table.length-2], 8);
String quantity = getString(table[table.length-1], 4);
return id + productId + price + quantity;
}
public static String getString(String data, int length)
{
String result = data.length() > length ? data.substring(0, length) : data;
while (result.length() < length)
result += " ";
return result;
}
}
Георгий Чолпан
41 уровень
Не проходит третий пункт, пишет "Товар с измененными данными должен находится на той же строке в файле.". Прошу помочь
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #2322530
16 сентября 2020, 13:17
как минимум тут ты дописываешь в конец файла.
прочитай все строки в список строк.
отредактируй тебе нужную (если такой id имеется)
и запиши весь список обратно в файл.
профит.
0
Георгий ЧолпанFull Stack Developer в Bank
16 сентября 2020, 13:21
Да, я пишу в конец файла. Но, после того как я все прочитал в список я его очищаю метод clearFile
0
hidden #2322530
16 сентября 2020, 13:23
окей. что ты здесь делаешь?
0
Георгий ЧолпанFull Stack Developer в Bank
16 сентября 2020, 13:25
Записываю в файл содержимое списка. Если не последний то пишу новую строку
0
hidden #2322530
16 сентября 2020, 13:26
upd: заработался. newLine просто добавляет новую строку.
у тебя есть список. находишь там элемент списка, у которого id равен нужному тебе.
потому ЗАМЕНЯЕШЬ этот элемент новой строкой.
и потом без разбору просто весь список записываешь в файл.
0
Георгий ЧолпанFull Stack Developer в Bank
16 сентября 2020, 13:28
Спасибо, сейчас попробую
0
hidden #2322530
16 сентября 2020, 13:31
у тебя вроде так и есть. сорян заработался. надо глянуть в IDEA его
0
Георгий ЧолпанFull Stack Developer в Bank
16 сентября 2020, 13:33
Убрал newLine и все пишет в одну строку
0
hidden #2322530
16 сентября 2020, 13:42решение
productName это исключительно args[2], представь что оно выглядит так "Штаны шерстяные, красные"
это все один аргумент args[2].
PS. вот твой код как работает сейчас:
при входной строке
выдает
вот из-за этой строки:
замени lineId на id
ты ведь проверяешь id, а если в строке какой то есть id , который начинается так же, как и в новой строке, (а пробелы же ты добавлял в другое место) то он думает что все ок. и первую попавшуюся строку берет за нужную.
PS. если тебя в условии задачи не просят выводить ничего в консоль. то перед отправкой валидатору, лучше это закомментировать.
+2
Георгий ЧолпанFull Stack Developer в Bank
16 сентября 2020, 13:57
Офигеть, я это не увидел. Сработало, валидация прошла.
Спасибо Артем, теперь ты мой друг.
0
hidden #2322530
16 сентября 2020, 13:59
ты слишком перегрузил задачу методами, вот и запутал сам себя. удачи.
0