2010-03-08 26 views
0

我正在尝试编写一个Java程序,该程序读取由URL组成的输入文件,从这些文件中提取令牌并跟踪每个令牌在文件中出现的次数。我已经写了下面的代码:Java中的数组变量初始化错误

import java.io.*; 
import java.net.*; 

public class Main { 

    static class Tokens 
    { 
     String name; 
     int count; 
    } 

    public static void main(String[] args) { 
     String url_str,host; 
     String htokens[]; 
     URL url; 
     boolean found=false; 
     Tokens t[]; 
     int i,j,k; 

     try 
     { 
      File f=new File("urlfile.txt"); 
      FileReader fr=new FileReader(f); 
      BufferedReader br=new BufferedReader(fr); 

      while((url_str=br.readLine())!=null) 
      { 
       url=new URL(url_str); 
       host=url.getHost(); 
       htokens=host.split("\\.|\\-|\\_|\\~|[0-9]"); 

       for(i=0;i<htokens.length;i++) 
       { 
        if(!htokens[i].isEmpty()) 
        { 
         for(j=0;j<t.length;j++) 
         { 
          if(htokens[i].equals(t[j].name)) 
          { t[j].count++; found=true; } 
         } 
         if(!found) 
         { 
          k=t.length; 
          t[k].name=htokens[i]; 
          t[k].count=1; 
         } 
        } 
       } 

       System.out.println(t.length + "class tokens :"); 
       for(i=0;i<t.length;i++) 
       { 
        System.out.println(
          "name :"+t[i].name+" frequency :"+t[i].count); 
       } 
      } 
      br.close(); 
      fr.close(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 
} 

但是当我运行它,它说:variable t not initialized.。我应该怎么做才能正确设置?

+0

在一个不相关的注释中,当你设置'found = true'时,你应该从内部循环中'break'。而且如果你有大量的标记,'HashMap '会提供更好的性能,所以也要考虑这一点。 – 2010-03-08 18:08:25

+1

另一个需要注意的是,有时候用这样的测试代码,你正在做一个try/catch(Exception)来避免一堆异常,我更喜欢我的主要异常 - 这是我确定“测试/实验”代码的一种方式。但是,在运输代码中,绝不会出现异常,请列出您实际期望的异常。 – 2010-03-08 18:18:43

回答

5

数组在Java中是固定长度,所以我觉得你真正想要做的是使用List<Tokens>

例如

List<Tokens> t = new ArrayList<Tokens>(); 

t.add(new Tokens(...)) 

,除非你事先知道你有项目的数量。

+0

非常感谢你,我想要一个动态数组,这工作:) – trinity 2010-03-08 19:03:03

1

初始化:

// Declaration: 
Tokens[] t; 

// Initialization: 
t = new Tokens[10]; // (Or whatever your desired length is) 

可以联合声明和初始化,和许多人。我不是这样做的粉丝,但:

Tokens[] t = new Tokens[10]; 

您将有与htokens相同的问题。

你可能想看看List接口(及其各种实现),而不是使用数组。

1

在使用之前,您未初始化Tokens t[];

编辑:你需要它,如下:

Tokens[] t = new Tokens[100]; // 100 is just an example 

或者使用List<Tokens>

1

你的代码声明t代表一个令牌数组。

但是,它没有定义该数组。

Java Documentation,你需要这样一行:

t = new Tokens[10]; // Or however large the array should be 
0

修改后的代码:<按布赖恩·阿格纽的答案>

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class Main { 


     static class Tokens 
     { 
      String name; 
      int count; 
      Tokens(String str,int c) 
      { 
       name=str; 
       count=c; 
      } 
     } 


     public static void main(String[] args) { 

     String url_str,host; 
     String htokens[]; 
     URL url; 
     boolean found=false; 
     List<Tokens> t = new ArrayList<Tokens>(); 

     int i,j,k; 

     try 
     { 
      File f=new File("urlfile.txt"); 
      FileReader fr=new FileReader(f); 
      BufferedReader br=new BufferedReader(fr); 


      while((url_str=br.readLine())!=null) 
      { 
      url=new URL(url_str); 

      host=url.getHost(); 
      htokens=host.split("\\.|\\-|\\_|\\~|[0-9]"); 

      for(i=0;i<htokens.length;i++) 
      { 
       if(!htokens[i].isEmpty()) 
       { 
        found=false; 
        for(j=0;j<t.size();j++) 
        { 

         if(htokens[i].equals(t.get(j).name)) 
         { 
          k=t.get(j).count+1; 
          t.set(j,new Tokens(htokens[i],k)); 
          found=true; 
          break; 
         } 
        } 
        if(!found) 
        { 
         t.add(new Tokens(htokens[i],1)); 
        } 
       } 
      } 

      } 
      System.out.println(t.size() + "class tokens :"); 
      for(i=0;i<t.size();i++) 
      { 
       System.out.println("name :"+t.get(i).name+" freq :"+t.get(i).count); 
      } 
      br.close(); 
      fr.close(); 

     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 


    } 

} 
0

就更不用说了,你不应该使用类似C阵列语法,即使用

String[] names = { "Walter", "Hans", "Bill" }; 

而不是

String names[] = { "Walter", "Hans", "Bill" };