从嵌套字符串中读取值

时间:2017-01-30 07:51:10

标签: java arraylist collections nested-loops

我正在阅读一个包含以下数据的文件。

  

{1 2 3 {4 5 6 {7 8 9} 10 11} 12 13 14 ......}

输出应为

  

1 2 3 12 13 14 4 5 6 10 11 7 8 9

。会有很多像这样的内部结构。

我们正在从文件中逐行阅读。内部组可以在任何地方开始和结束(从第1行开始到第5行结束。因此我们需要检查文件中的所有行)。

我尝试为每个内部组使用List-List of List但是它不起作用,因为我们在内部循环完成后有一些数据,它应该在内部组之前。

使用大括号计算并使用嵌套for循环可以工作,但它会影响性能。如果有更好的方法,请你告诉我。最终结果应该是具有上述顺序的一个列表。

3 个答案:

答案 0 :(得分:0)

这可以使用/*! Return requested XmlNode value @param name of the XmlNode @param filter by given attribute(s) -> name:value @return value of XmlNode or empty string in case of error */ std::string XmlParser::GetNodeValue(std::string node, std::vector<std::pair<std::string,std::string>> &attributes /* = std::vector<std::pair<std::string,std::string>>() */) { try { std::string nodeValue = ""; if(attributes.size() != 0) nodeValue = m_xmlDoc.select_node(CreateXPath(node, attributes).c_str()).node().child_value(); else nodeValue = m_xmlDoc.select_node(("//" + node).c_str()).node().child_value(); return nodeValue; } catch(std::exception exp) { return ""; } } 完成,如图所示

Stack

每次遇到 String str = "{1 2 3{4 5 6{7 8 9}10 11}12 13 14}"; StringBuilder res = new StringBuilder(); Stack<StringBuilder> temp = new Stack<>(); for(char c : str.toCharArray()){ switch(c){ case '{': if(!temp.isEmpty())temp.peek().append(","); temp.push(new StringBuilder()); break; case '}': if(!temp.isEmpty())temp.peek().append(","); res.insert(0,temp.pop()); break; case ' ': temp.peek().append(","); break; default: temp.peek().append(c); } } System.out.println(res); //1,2,3,12,13,14,4,5,6,10,11,7,8,9, 时都会遇到新的{来读取数字。找到StringBuilder后,我们会弹出并输出结果。这可以使用}进行优化,一次读取范围字符,而不是一次读取单个字符。

答案 1 :(得分:0)

不确定这是否适用于您。我正在玩jsoup,一个HTML Parser,用于我自己的项目,并提出了这个想法。首先用开口div标签替换所有开口支架,用关闭div标签替换所有关闭支架。然后从外部div开始附加div的ownTexts。例如:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupTest {
    public static void main(String[] args){                       
        String html = "{1 2 3 {4 5 6 {7 8 9}10 11}12 13 14}";
        html = html.replaceAll("\\{", "<div>").replaceAll("\\}", "</div>");    
        System.out.println(html);

        Document doc = Jsoup.parse(html);            
        Elements es = doc.select("div");
        StringBuilder sb = new StringBuilder();
        for(Element e :es){
            sb.append(e.ownText());
            sb.append(" ");
        }
        System.out.println(sb.toString());
    }
}
// 1 2 3 12 13 14 4 5 6 10 11 7 8 9 

答案 2 :(得分:0)

另一种方法可能是在每个{或}分割字符串,并将数组的第一个元素与最后一个元素连接,第二个元素与第二个元素连接,依此类推。示例:

    public static void main(String[] args){                       
        String str = "{1 2 3{4 5 6{7 8 9}10 11}12 13 14}";
        String [] splited = str.replaceFirst("\\{", "").split("\\{|\\}");
        System.out.println(Arrays.toString(splited));
        StringBuilder sb = new StringBuilder();
        for(int i = 0, j = splited.length-1;i<j;i++,j--){
            sb.append(splited[i]).append(" ").append(splited[j]).append(" ");
        }
        sb.append(splited[splited.length/2 ]);
        System.out.println(sb.toString());
    }