2015-09-21 4 views
0

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

import java.io.IOException; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.File; 

public class a1_12177903 
{ 
public static void main(String [] args) throws IOException 
{ 
    if (args[0] == null) 
    { 
     System.out.println("File not found"); 
    } 
    else 
    {  
    File file = new File(args[0]); 
    FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = ""; 

    while (br.ready()) 
    { 
     line += br.readLine(); 
    } 

    String[] work = line.split(","); 
    double[] doubleArr = new double[work.length]; 
    for (int i =0; i < doubleArr.length; i++) 
    { 
     doubleArr[i] = Double.parseDouble(work[i]); 
    } 


    double maxStartIndex=0; 
    double maxEndIndex=0; 
    double maxSum = 0; 

    double total = 0; 
    double maxStartIndexUntilNow = 0; 

    for (int currentIndex = 0; currentIndex < doubleArr.length; currentIndex++) 
    { 

     double eachArrayItem = doubleArr[currentIndex]; 

     total += eachArrayItem; 

     if(total > maxSum) 
     { 
      maxSum = total; 
      maxStartIndex = maxStartIndexUntilNow; 
      maxEndIndex = currentIndex; 
     } 
     if (total < 0) 
     { 
      maxStartIndexUntilNow = currentIndex; 
      total = 0; 
     } 
    } 

    System.out.println("Max sum   : "+  maxSum); 
    System.out.println("Max start index : "+ maxStartIndex); 
    System.out.println("Max end index : " +maxEndIndex); 


} 
} 
} 

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

+1

Звучит как план. Сообщите нам, как это работает для вас. – Stultuske

+0

Сначала читайте во входном файле от пользователя. Затем используйте Reader для получения содержимого из файла. – Turtle

ответ

2

Вы можете сделать это с Java8 Streams, предполагая, что каждый элемент имеет свою собственную линию

double[] doubleArr = Files.lines(pathToFile) 
          .mapToDouble(Double::valueOf) 
          .toArray(); 

Если вы используете это на производственных систем (а не в качестве упражнения), что стоило бы создать поток внутри блока Try with Resources. Это позволит убедиться, что ваш входной файл закрыт правильно.

try(Stream<String> lines = Files.lines(path)){ 
    doubleArr = stream.mapToDouble(Double::valueOf) 
         .toArray(); 
} 

Если у вас есть список с разделителями-запятыми, сначала вам нужно разбить их и использовать flatMap.

double[] doubleArr = Files.lines(pathToFile) 
          .flatMap(line->Stream.of(line.split(",")) 
          .mapToDouble(Double::valueOf) 
          .toArray(); 
0

Эта ссылка может помочь: How to use BufferedReader. Затем вы получите String, содержащий массив.

Далее у вас есть несколько способов анализа строки в массиве.

  1. Используйте JSONArray для его анализа. Для получения дополнительной информации, найдите google для JSON.
  2. Используйте функцию split() для анализа строки в массиве. Смотри ниже.

Код для пути 2:

String line="10,20,50";//in fact you get this from file input. 
String[] raw=line.split(","); 
String[] arr=new String[raw.length]; 
for(int i=0;i<raw.length;++i)arr[i]=raw[i]; 
//now arr is what you want 
1
public static void main(String[] args) throws IOException { 
    String fileName = ""; 
    File inputFile = new File(fileName); 
    BufferedReader br = new BufferedReader(new FileReader(inputFile)); 

    // if input is in single line 
    StringTokenizer str = new StringTokenizer(br.readLine()); 
    double[] intArr = new double[str.countTokens()]; 
    for (int i = 0; i < str.countTokens(); i++) { 
     intArr[i] = Double.parseDouble(str.nextToken()); 
    } 

    // if multiple lines in input file for a single case 
    String line = ""; 
    ArrayList<Double> arryList = new ArrayList<>(); 

    while ((line = br.readLine()) != null) { 
     // delimiter of your choice 
     for (String x : line.split(" ")) { 
      arryList.add(Double.parseDouble(x)); 
     } 
    } 
    // convert arraylist to array or maybe process arrayList 

} 
0

Используйте потоки, если вы на JDK8. И, пожалуйста, позаботьтесь о принципах дизайна и шаблонах. Кажется, что шаблон стратегии/шаблона может быть применен здесь. Я знаю, никто здесь не просил бы вас сосредоточиться на разработке руководящих принципов. И также, пожалуйста, позаботьтесь об условных обозначениях. «Файл» как имя класса не является хорошим именем.

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