【问题标题】:Reading two lines from an input file using Scanner使用扫描仪从输入文件中读取两行
【发布时间】:2013-07-26 21:59:08
【问题描述】:

您好,我在暑假上编程课,需要创建一个从文件读取输入的程序。输入文件包括 DNA 序列 ATCGAGG 等,文件的第一行说明需要比较多少对序列。其余的是成对的序列。在课堂上,我们使用 Scanner 方法从文件中输入行,(我阅读了有关 bufferedReader 的内容,但我们没有在课堂上介绍它,所以不熟悉它)但是我不知道如何编写代码来比较两行Scanner 方法同时进行。

我的尝试:

public static void main (String [] args) throws IOException 
{
File inFile = new File ("dna.txt");

Scanner sc = new Scanner (inFile);
while (sc.hasNextLine())
{
  int pairs = sc.nextLine();
  String DNA1 = sc.nextLine();
  String DNA2 = sc.nextLine();
  comparison(DNA1,DNA2);
}
sc.close();
}

如果它们有共同的任何共同字符,比较方法将采用一对序列并输出。另外,我将如何继续输入下一对,任何见解都会有所帮助.. 只是被难住了,谷歌让我更加困惑。谢谢!

编辑

这是示例输入

7
atgcatgcatgc
AtgcgAtgc
GGcaAtt
ggcaatt
GcT
gatt
aaaaaGTCAcccctccccc
GTCAaaaaccccgccccc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gctagtacACCT
gctattacGcct

【问题讨论】:

  • int pairs = sc.nextLine(); 这应该是int pairs = Integer.parseInt(sc.nextLine()); 无论如何你能告诉我们dna.txt 文件的结构以供参考。
  • 但据我了解,您必须阅读while 循环之外的pairs
  • 我认为while循环只是意味着只要有另一行它就会打印它,第一行决定了对所以我认为它应该进入循环..它还会读吗循环外txt的第一行?
  • 是的,如果有可用线路的话。但是一旦通过hasNextLine() 行,方法检查下一行是否可用,如果存在则返回true,保持while 循环运行,否则返回falseSee Scanner#hasNextLine()
  • 说到hasNextLine(),在while循环中,有没有办法将每一行存储为数组的索引,然后使用我的比较方法调用它们进行比较?跨度>

标签: java


【解决方案1】:

首先你为什么这样做:

while (sc.hasNextLine())
{
  int pairs = sc.nextLine();

虽然你只在一行中有对,而不是对和两行输入,但只有几行?从while循环中移动读取对并将其解析为int,然后没关系,但如果您知道有多少行,您可以使用它来停止读取行。

第二:

throws IOException

可能无关紧要,但是,如果您不关心异常,您真的不知道如何尝试捕获并假设跳过?

比较,如果您读取字符串,则字符串具有“等于”方法,您可以使用该方法比较两个字符串。

谷歌不会帮你解决这些问题,你只是不知道这一切,但如果你想知道然后搜索基本的东西,比如输入谷歌“字符串比较 java”,不要认为你能找到解决方案在谷歌中输入“使用扫描仪从输入文件中读取两行”,您必须逐步将问题切割成更小的部分,这就是软件开发人员的做法。

好的,我有 progz 不知何故为我工作,只是找到有东西的行,然后即使我有部分也打印出来,所以对于这样的事情来说,蛮力是可以的:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class program
{

public static void main (String [] args) throws IOException 
{
File inFile = new File ("c:\\dna.txt");

Scanner sc = new Scanner (inFile);
int pairs = Integer.parseInt(sc.nextLine());
for (int i = 0; i< pairs-1; i++)
{
    //ok we have 7 pairs so we do not compare everything that is one under another
  String DNA1 = sc.nextLine();
  String DNA2 = sc.nextLine();
  Boolean compareResult = comparison(DNA1,DNA2);

  if (compareResult){
    System.out.println("found the match in:" + DNA1 + " and " + DNA2)  ;
  }
}
sc.close();
}


public static Boolean comparison(String dna1, String dna2){

    Boolean contains = false;
    for (int i = 0; i< dna1.length(); i++)
    {
        if (dna2.contains(dna1.subSequence(0, i)))
        {
            contains = true;
            break;
        }
        if (dna2.contains(dna1.subSequence(dna1.length()-i,dna1.length()-1 )))
        {
            contains = true;
            break;
        }       
    }

    return contains;    
}

}

【讨论】:

  • equals 方法不起作用,因为例如字符串 1 是 AGCTATTT,字符串 2 是 ATCTAGGGG,那么它们的共同序列只有“CTA”,而 equals 不会捕捉到这一点。大声笑,这很有趣,因为这正是我在谷歌上搜索到的,但我想我不可能是唯一一个问这个的人。到目前为止,我们还没有学习 try catch,只有 Scanner、Filewriter 和 Printwriter
  • 我对 DNA 编码知之甚少,但是您需要对部分字符串进行比较,这是在字典中搜索的另一项内容,然后您必须先拆分您输入的行nextLine() 并在第二个字符串中使用 contains() 方法检查部分内容。
  • @user2624368 我已经用蛮力解决方案更新了我的答案,我认为这还可以。
猜你喜欢
  • 2016-03-02
  • 2014-05-08
  • 2013-12-04
  • 2014-05-11
  • 2022-01-07
相关资源
最近更新 更多