#java #spring #file #large-files #r.java-file
Вопрос:
я написал этот код, но он потерпит неудачу в файле размером 1 ГБ.
public class TestFiles {
public static void main(String[] args) {
int minLength = Integer.MAX_VALUE;
int maxLength = Integer.MIN_VALUE;
String minWord = "";
String maxWord = "";
List<String> words = new ArrayList<>();
try {
File myObj = new File("C:\Users\Downloads\java.txt");
Scanner myReader = new Scanner(myObj);
while (myReader.hasNextLine()) {
String data = myReader.nextLine();
String[] dataArray = data.split(" ");
List<String> list = Arrays.asList(dataArray);
for (String s : list) {
if (s.length() < minLength) {
minLength = s.length();
minWord = s;
} else if (s.length() > maxLength) {
maxLength = s.length();
maxWord = s;
}
}
}
myReader.close();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("min length " minLength " - max lenth " maxLength);
System.out.println("min length word " minWord " - max lenth word " maxLength);
}
}
не могли бы вы ответить, пожалуйста? как я могу это решить?
Комментарии:
1. Вы, кажется, не держите слов, поэтому я бы предложил потоковое воспроизведение строк. Взгляните на
Files.lines(Path)
это . Оттуда вы можете использоватьflatMap()
для сопоставления потока строк с потоком слов, а затемmax()
с помощью соответствующего компаратора.2. «он потерпит неудачу»: как он терпит неудачу? Исключение? Пожалуйста, опишите!
3. вероятно, проблема с памятью
4. вероятно/очевидно: 1 ГБ данных, но ни одного(/слишком мало) разрыва строк!!
5. не делайте это «по строчкам», делайте это «по словам»!!!;) (не
nextLine()
..толькоnext()
!)
Ответ №1:
Проблема становится очевидной, когда 1 гб слов сжимается в 1 строку!*
Решение: Не обрабатывать ввод «по строкам», а «по словам», что достаточно эффективно! 😉
Вуаля:
public class TestFiles {
public static void main(String[] args) {
int minLength = Integer.MAX_VALUE;
int maxLength = Integer.MIN_VALUE;
String minWord = "";
String maxWord = "";
try {
File myObj = new File("C:\Users\Downloads\java.txt");
Scanner myReader = new Scanner(myObj);
while (myReader.hasNext()) {
String word = myReader.next();
if (word.length() < minLength) {
minLength = word.length();
minWord = word;
}
if (word.length() > maxLength) {
maxLength = word.length();
maxWord = word;
}
}
}
myReader.close();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("min length " minLength " - max lenth " maxLength);
System.out.println("min length word " minWord " - max lenth word " maxLength);
}
}
*когда «много» слов в одной строке, тогда у нас могут возникнуть проблемы здесь:
myReader.hasNextLine()
,String data = myReader.nextLine()
иString[] dataArray = data.split(" ");
ответ @huy также правильный: else
он «эффективен в большинстве случаев», но «неверен для угловых случаев».
Комментарии:
1. Вы правы, я имел в виду поток ввода файлов docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
Ответ №2:
int len = s.length();
if (len < minLength) {
minLength = len;
minWord = s;
}
if (len > maxLength) {
maxLength = len;
maxWord = s;
}
Ваш тестовый случай завершится неудачей, если большая строка расположена в первом индексе первой строки.
Кстати, я думаю, вам следует разбить свой большой тест на маленький тест, попытаться найти маленькую строку и большую строку для одной строки, после этого несколько строк и данные из файлов
Комментарии:
1. Возможно, вы захотите, чтобы ваш ответ было немного легче прочитать, т. Е. Я почти пропустил часть «удалить остальное «.
2. Работает ли это, я ненавижу редактор stackoverflow, им трудно пользоваться. ^^
3. Кстати, я бы добавил еще несколько объяснений, почему
else
их следует удалить, например, на каком-нибудь примере, чтобы помочь тем, кто может бороться с концепцией.4. Ваш тестовый случай завершится неудачей, если большая строка расположена в первом индексе первой строки. Кстати, я думаю, что вам следует разбить свой большой тест на маленький тест, попытаться найти маленькую строку и большую строку для строки опаления, после этого несколько строк и данные из файлов.