我正在阅读一个包含以下数据的文件。
{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循环可以工作,但它会影响性能。如果有更好的方法,请你告诉我。最终结果应该是具有上述顺序的一个列表。
答案 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());
}