簡體   English   中英

從文本文件中獲取值並將其放入數組中

[英]Take values from a text file and put them in a array

現在,在我的程序中,我正在使用硬編碼的值,但是我想要它,以便用戶可以使用任何文本文件並獲得相同的結果。

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);


}
}
}

我已經對其進行了修復,因此它可以從命令行獲取文本文件的名稱。 如果有人有任何改進的方法,我會很樂意接受任何改進。

您可以使用Java8 Streams做到這一點,假設每個條目都有自己的行

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

如果您在生產系統上使用此功能(而不是作為練習),則值得在Try with Resources塊內創建Stream。 這將確保您的輸入文件已正確關閉。

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();
    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

}

該鏈接可能會有所幫助: 如何使用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

如果您使用的是JDK8,請使用流。 並且請同時注意設計原則/模式。 似乎可以在此處應用策略/模板設計模式。 我知道,這里沒有人會要求您專注於設計准則,還請注意命名約定。 “文件”作為類名不是一個好名字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM