【问题标题】:How to make a multiple word dog name count as one token如何使多字狗名计为一个标记
【发布时间】:2014-09-18 06:01:39
【问题描述】:

我的代码从一行中提取每个单词,并用空格将它们分隔成标记。如果或多或少会打印错误,则每行上应该只有 6 类标记。问题是当狗的名字之间有空格时,比如德国牧羊犬。我的代码将其视为错误。 如果 Dog 名称为 German Shepard,我希望我的代码将其视为一个标记,例如“German Shepard”。

ArrayList<Dog> dogs = new ArrayList<Dog>();
int numLine= 0;
while(sc.hasNextLine())
    {

    // read a line from the input file via sc into line
        line = sc.nextLine();
        numLine++;
        String[] fields =line.split("\\s+");
        if(fields.length != 6) 
        {
       System.out.println(line);
       System.out.println("ERROR ON LINE #"+numLine+
       ":number of fields on line must be 6, not "+ fields.length);
       System.out.println();
        }
         // got from Dr. Koch email infromation 


        try{
        StringTokenizer stk = new StringTokenizer(line);
        String name = stk.nextToken();
        String breed = stk.nextToken();
        int month = Integer.parseInt(stk.nextToken());
        int day = Integer.parseInt(stk.nextToken());
        int year = Integer.parseInt(stk.nextToken());
        double weight = Double.parseDouble(stk.nextToken());

        Dog list = new Dog(name, breed, month, day, year, weight);


        dogs.add(list);





        }

        catch(Exception missError)
        {


        }

    }
     // close the file
sc.close();

【问题讨论】:

  • 您正在对 ' ' 进行拆分,仅使用 ' ' 分隔数据是个坏主意,您应该使用 '|'或';'。

标签: java arraylist split token


【解决方案1】:

在检查没有之前。一行中的单词,使用正则表达式并连接标记。

喜欢,

String pattern = "([A-Z][a-z]+)(\s)([A-Z][a-z]+)";
line = line.replaceAll(pattern, "$1_$3");  

然后用空格分割行并检查单词的数量,比如 6 或任何你想要的数字。

【讨论】:

    【解决方案2】:

    您需要重新考虑如何标记您的线路。如果空格在值中有效,例如您的德国牧羊犬示例,则您不能使用空格作为分隔符。您可以按照 Gonza 的建议使用 '|'或“;”,前提是这些不会出现在您的值中(不太可能,根据您的描述)。就个人而言,在读取文件时,我倾向于使用不可键入的 unicode 字符,例如大写的 Omega - "\u03A9"。

    另一种选择是用双引号将所有值括起来,如下所示:

    “Fido”“德国牧羊犬”“01”“01”“2014”“40”

    然后您可以使用正则表达式提取值。大致如下:

    public String[] getDogRecord(String fieldList)
    {
      final int DOG_FIELD_COUNT = 6;
      final String DOG_FIELD_REGEX = "\"([^\"]+)\"\\s*";
      final Pattern FIELD_PTTRN = Pattern.compile(DOG_FIELD_REGEX);
    
      int fieldCount = 0;
      Matcher fieldMatcher = FIELD_PTTRN.matcher(fieldList);
      String[] dogRecord = new String[DOG_FIELD_COUNT];
    
      // First, check we have the right number of fields
      if (!fieldList.matches("(" + DOG_FIELD_REGEX + "){" + DOG_FIELD_COUNT + "}"))
        throw new IllegalArgumentException("Incorrect number of fields in record!");
    
      // Read each field into an array
      while (fieldMatcher.find())
      {
        dogRecord[fieldCount] = fieldList.substring(fieldMatcher.start(1),
                                                    fieldMatcher.end(1));
        fieldCount++;
      }
    
      return dogRecord;
    }
    

    您当然需要在创建 Dog 对象时解析适当的数组条目。或者,您可以修改上述内容以直接返回 Dog 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      相关资源
      最近更新 更多