【问题标题】:Yet Another getting text file into Arraylist另一个将文本文件放入 Arraylist
【发布时间】:2011-04-18 19:33:22
【问题描述】:

我正在尝试获取文本文件中每一行的每个元素,以便可以逐行执行计算。问题是我只能从我的文本中获取每个单独的元素。我希望能够指向第 50 行并提取第一个元素、第二个、第三个元素,然后转到第 51 行并执行相同的操作。

    import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ReadWithScanner {



    public static void main(String[] args) throws IOException {
            Scanner scanner = new Scanner(new File("/Users/evanlivingston/2.txt"));
            List<Double> doubles = new ArrayList<Double>();{
            while(scanner.hasNextLine()){
                doubles.add(scanner.nextDouble());
            }
            for( int counter=0; counter<doubles.size(); counter++ ) {
                // j=i+1 to calculate the distance between two points only once, 
                // not one way and back; also skip calculating distance between 
                // the same point
                for( int j=counter+1; j<doubles.size(); j++ ) { 
                    Double c1 = doubles.get(counter);
                    Double c2 = doubles.get(j); 
            System.out.println(c1 - c2);    
                }
            }
        }
    }
    }

我的文本文件如下所示:

0 10 12 4 5 6

0 10 12 4 5 7

... 20 20 20 20 20 20

【问题讨论】:

  • 你能稍微改一下这个问题吗?理解您的问题到底是什么有点困难。
  • 为什么会有嵌套循环?
  • 您说要提取每行的第一个、第二个和第三个元素,但似乎每行有 6 个元素。您是否故意跳过元素 4 到 6?

标签: java text arraylist


【解决方案1】:

我认为问题出在这里:

while(scanner.hasNextLine()){
            doubles.add(scanner.nextDouble());
        }

如果您的意图是解析一行中的每个双精度并且有多行,那么您做错了。 我认为你需要这样的东西:

while (scanner.hasNextLine()){
      String currentLine = scanner.nextLine();
      //here iterate the string currentLine to get each double
}

【讨论】:

  • 虽然我同意它的风格很差,但它会得到所有人。 hasNextLine() 不会跳过该行的其余部分。
  • @glowcoder:你是对的。无论如何,我认为他的问题与获取每行的每个双倍,逐行访问它们有关。所以它应该调用 nextLine() 来划分行组中的所有双精度
  • @Overbose,我正在尝试将整个文本加载到内存中,然后再开始遍历行并进行计算,您提出的解决方案不允许这样做正确吗?
  • @Evan 即使全部加载它仍然可以做到这一点,但是 1,你现在还没有将整个文本加载到内存中,还有两个你为什么要这样做?
  • @glowcoder,我正在对文件中的每一行与其他每一行执行计算,如果我有 60,000 行,我将创建 3,600,000,000 行。我正在努力使其尽可能高效。
【解决方案2】:

扩展 0verbose 的回答:您似乎想逐行获取元素,即稍后您想知道双精度在哪一行。

因此,尝试使用List&lt;List&lt;Double&gt;&gt; 并为每行创建一个包含双精度的子列表。 如果所有行的元素数量相同,您可以使用单个列表,然后使用 index = line_no * num_elements_per_line + element_index_in_line 来处理特定元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2021-05-31
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多