2013-05-17 41 views
1
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方法中,并将提取的数据作为带标签标头的字符串返回,而不包含“< START>”和“< END TAG“>只在开始标签上留下标题。我将如何整理这个代码到Java中的循环?

+0

你可以使用一个数组而不是那么多的变量,我想!!! – NINCOMPOOP

+0

通过使用'array'和'for-loop'。 – Tdorno

+0

你能告诉我该怎么做吗? – Lance

回答

0

你可以尝试这样的事情,如果可以优化它:

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(); 
} 
+0

谢谢大家!这实际上工作!但我的问题是为什么在“temp.append(prefix [i%5] + extract)”这一行有一个模数符号;“ – Lance

+0

我只是想确保如果'attrList.length> 5','prefix [i%5]'不会抛出'ArrayIndexOutOfBoundsException' .. – NINCOMPOOP

+0

如何在没有模数的情况下编写它? – Lance

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已超过500元。

0

这应该工作。你可以,如果你使用的是Java 7

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代替= new ArrayList<String>= new ArrayList<>()。如果你只需要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; 
}