-1

基本的なアルゴリズムは、いくつかの文を含む入力ファイルがあり、各文が各行にあります。位置 s から e までの文の一部を出力したいのですが、以下のコードでは空白行が出力されます。私の間違いがどこにあるのか教えてください。

public class Email13 
{
    static boolean isValidEmailCharacter(char c)
    {
        boolean result = false;
        if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||(c=='.')||(c=='-')||(c=='+'))
            result = true;
        return result;
    }

    public static void main(String[] args) throws Exception{
        BufferedReader cin, fin;
        cin = new BufferedReader(new InputStreamReader(System.in));
        //Description
        System.out.println("Programmer: Minh Nguyen");
        System.out.println("Description: This program is to start the final project.");
        System.out.println();    

        String nameIn, nameOut, deIn, deOut;
        nameIn="";
        nameOut="";
        deIn = "fileContainingEmails.txt";

        System.out.print("Enter input filename [default:" + deIn + "]: ");
        nameIn = cin.readLine();

        if(nameIn.compareTo("")==0){
            nameIn = deIn;
            deOut = "copyPasteMyEmails.txt";
            System.out.print("Enter output filename [default:" + deOut + "]: ");
            nameOut = cin.readLine();
            if(nameOut.compareTo("")==0)
                nameOut = deOut;
        }
        else if(nameIn.compareTo("")>0){
            deOut = nameIn;
            System.out.print("Enter output filename [default:" + deOut + "]: ");
            nameOut = cin.readLine();
            if(nameOut.compareTo("")==0)
                nameOut = nameIn;
        }
        fin = new BufferedReader(new FileReader(nameIn));
        //Read the input file
        while(true)
        {
            if(!fin.ready()) break;
            String lineFromFile;
            lineFromFile = fin.readLine();
            int s, e, hasDot;

            for (int i = 0; i < lineFromFile.length(); i++) // for each char in the string...           
            {
                if(lineFromFile.charAt(i)=='@')
                {
                    for(s=i;s>-1;s--)
                    {
                        if(isValidEmailCharacter(lineFromFile.charAt(s))==false)
                            break;
                    }
                    for(e=i; e< lineFromFile.length(); e++)
                    {
                        if(isValidEmailCharacter(lineFromFile.charAt(e))==false)
                            break;
                    }

                    String anEmail = lineFromFile.substring(s,e);
                    System.out.println(anEmail);
                }                                             
            }
        }
        fin.close();

        PrintWriter fout;
        fout = new PrintWriter(new FileWriter(nameOut));
        fout.close();        
    }

}
4

2 に答える 2

0
    I try this but it doesn't work:(           
      s=i;
  while(s>-1)
  {
      if(isValidEmailCharacter(lineFromFile.charAt(s))==false)
        break;
      else
          s = 0;
      s--;
  }
  e=i;
  while(e< lineFromFile.length())
  {
      if(isValidEmailCharacter(lineFromFile.charAt(e))==false)
      break;
      else
          e = lineFromFile.length();
      e++;`enter code here`
  }
于 2013-05-19T19:41:11.620 に答える
0

s-- を実行すると、すべての文字が適切な場合、その for ループは s が -1 に等しい状態で終了する可能性があります。同じ問題が e++ に影響する可能性があります。ただし、部分文字列の最後のインデックスでは、char の位置よりも 1 つ多くしたいと考えています。つまり、String cat = "Cat"; 文字列 temp = cat.substring(0, 1) は C を返します。

s ループで境界をチェックするには、次を試してください。

for(s=i;s>-1;s--)
{
if(isValidEmailCharacter(lineFromFile.charAt(s))==false)
break; 
}
if(s <0)// if it never hit break s is now == -1
s=0;

ループの基本を覚えておいてください。私が行った場合

for(a=0; a<10; a++)
;

私が終わったとき、aは10に等しいです。値 10 でループを実行しないのは、10 であるため a< 10 で失敗するためですが、a=10 で終了します。

于 2013-05-19T19:11:41.583 に答える