【问题标题】:How would I tidy this code into a loop in java?我如何将这段代码整理成java中的循环?
【发布时间】:2013-05-17 15:32:31
【问题描述】:
 public class TagHandler {

private final String START = "<START ";
private final String END = "<END ";


    public String handleTag(String buf, String[] attrList) {  

     String startPattern1 = START+attrList[0]+">";
    String endPattern1 = END+attrList[0]+">";

    String startPattern2 = START+attrList[1]+">";
    String endPattern2 = END+attrList[1]+">";

    String startPattern3 = START+attrList[2]+">";
    String endPattern3 = END+attrList[2]+">";

    String startPattern4 = START+attrList[3]+">";
    String endPattern4 = END+attrList[3]+">";

    String startPattern5 = START+attrList[4]+">";
    String endPattern5 = END+attrList[4]+">";


           String extract1 = new String(buf);
    String extract2 = new String(buf);
    String extract3 = new String(buf);
    String extract4 = new String(buf);
    String extract5 = new String(buf);

            extract1 = extract1.substring(extract1.indexOf(startPattern1)+startPattern1.length(), extract1.indexOf(endPattern1));
    extract2 = extract2.substring(extract2.indexOf(startPattern2)+startPattern2.length(), extract2.indexOf(endPattern2));
    extract3 = extract3.substring(extract3.indexOf(startPattern3)+startPattern3.length(), extract3.indexOf(endPattern3));
    extract4 = extract4.substring(extract4.indexOf(startPattern4)+startPattern4.length(), extract4.indexOf(endPattern4));
    extract5 = extract5.substring(extract5.indexOf(startPattern5)+startPattern5.length(), extract5.indexOf(endPattern5));

 String s = ("BLOPABP"+extract1) + ("\nBLOPCALL"+extract2) +("\nBLOPEXP"+extract3) +("\nBLOPHEAD"+extract4)+("\nBLOPMAJ"+extract5);

return s;
  }

如何将上面的代码整理成某种循环?基本上我有一个文件,我正在读取并提取标签中的数据,我将标签传递给这个 TagHandler 方法,并将提取的数据作为字符串返回,标签标题没有“”和“只在开始标签上留下标题。

【问题讨论】:

  • 我想你可以用数组代替这么多变量!!!
  • 通过使用arrayfor-loop
  • 你能告诉我怎么做吗?

标签: java string tags extract


【解决方案1】:

给你。这应该可以满足您的需求。

public class TagHandler {

private final String START = "<START ";
private final String END = "<END ";

public String handleTag(String buf, String[] attrList) {

    String[] blop = {"BLOPABP", "BLOPCALL", "BLOPEXP", "BLOPHEAD", "BLOPMAJ"};
    String s = "";

    for (int i = 0; i < attrList.length; i++) {
        String startPattern = START+attrList[i]+">";
        String endPattern = END+attrList[i]+">";
        String extract = buf.substring(buf.indexOf(startPattern)+startPattern.length(), buf.indexOf(endPattern));
        s += blop[i]+extract;
        if (i < attrList.length-1) {
            s +=  "\n";
        }
    }
    return s;

}

}

如果 attrList 有超过 5 个元素,请注意越界异常。

【讨论】:

    【解决方案2】:

    你可以试试这样的,如果可以的话优化一下:

    public String handleTag(String buf, String[] attrList) {
        StringBuilder temp = new StringBuilder();
        final String[] prefix = {"BLOPABP","\nBLOPCALL","\nBLOPEXP",
                           "\nBLOPHEAD","\nBLOPMAJ"};
        for(int i=0;i<attrList.length;i++){
            String startPattern = START+attrList[i]+">";
            String endPattern = END+attrList[i]+">";
            String extract = new String(buf);
            extract = extract.substring(
                    extract.indexOf(startPattern)+startPattern.length(), 
                    extract.indexOf(endPattern));
            temp.append(prefix[i%5]+extract);
        }
    
      return temp.toString();
    }
    

    【讨论】:

    • 哇,谢谢伙计!这确实有效!但我的问题是为什么“temp.append(prefix[i%5]+extract);”行有一个模符号
    • 我只是想确保如果attrList.length &gt; 5, prefix[i%5] 不会抛出ArrayIndexOutOfBoundsException ..
    • 没有模数你怎么写?
    • 你会添加一个 try and catch 块吗?
    • 它有什么用途?如果大于 5 ,那么显然你会缺少前缀!!!然后我会检查,而不是 try-catch ..
    【解决方案3】:

    这应该可行。如果您使用的是 java 7,则可以将 = new ArrayList&lt;String&gt; 替换为 = new ArrayList&lt;&gt;()

    private final String START = "<START ";
    private final String END = "<END ";
    List<String> startPatterns = new ArrayList<String>();//can use ArrayList<> instead if java 1.7
    List<String> stringExtracts = new ArrayList<String>();
    final String[] tags = new String[]{"BLOPABP","\nBLOPCALL","\nBLOPEXP","\nBLOPHEAD","\nBLOPMAJ"};
    
    public String handleTag(String buf, String[] attrList) {
        int numPatterns = tags.length;
        String s;
        String extract = new String(buf);
        for(int i=0; i<numPatterns; i++){
            String startPattern = START+attrList[i]+">";
            startPatterns.add(startPattern);
            String endPattern = END+attrList[i]+">";
            endPatterns.add(endPattern);
            String extract = extract.substring(extract.indexOf(startPattern)+startPattern.length(), extract.indexOf(endPattern));
            stringExtracts.add(extract);
            s += tags[i] + extract;
        }
        return s;
    }
    

    这假设您需要再次访问单独的 startPatterns、endPatterns 和 stringExtracts,而不仅仅是 s。如果您只需要 s 则丢弃 ArrayLists - 它会像这样工作:

    private final String START = "<START ";
    private final String END = "<END ";
    final String[] tags = new String[]{"BLOPABP","\nBLOPCALL","\nBLOPEXP","\nBLOPHEAD","\nBLOPMAJ"};
    
    public String handleTag(String buf, String[] attrList) {
        int numPatterns = tags.length;
        String s;
        String extract = new String(buf);
        for(int i=0; i<numPatterns; i++){
            String startPattern = START+attrList[i]+">";
            String endPattern = END+attrList[i]+">";
            String extract = extract.substring(extract.indexOf(startPattern)+startPattern.length(), extract.indexOf(endPattern));
            s += tags[i] + extract;
        }
        return s;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多