我有两个代表树木的字符串。每个'{'意味着在树中降低等级(孩子)。 每个字符串包含字母(或单词)除以'{'一个或多个。 我想只转换相同级别的字母 - 第二个(或第一个)字符串与另一个字母的字母顺序相同而不改变字符串中的位置。 这是一个例子:
app:elevation="0dp"
我想将str2更改为“{a {b} {c {d {e}}}}”。由于'b'和'c'都处于同一级别(str1和str2中'a'的孩子),因此它们在str1和str2中的顺序不同。对于'd'和'e'也是如此。我想将它们在str2中更改为str2< - “{a {c} {b {{d} {e}}}}”与str1中的顺序相同。 单个字母仅是示例。它们可能比一个字母长。 有一个快速而简短的解决方案吗? 我认为最好的方法是对每个字符串进行排序,例如:
> str1<-"{a{b}{c{{d}{e}}}}"
> str2<-"{a{c}{b{{e}{d}}}}"
对于这个问题,这对我来说是个很好的中间解决方案。 命令sort(x)用于向量。我想使用字符串并保持'{'的位置。这意味着只有相同级别的节点(兄弟节点)我们可以排序,但不能在更高级别之间排序。例如,在以下情况中:
> str1<-"{a{b}{c{{d}{e}}}}"
> str2<-"{a{b}{c{{d}{e}}}}"
因为'a'是根,'b'是他的孩子,反之亦然str2我们无法对这种情况进行排序。我们可以在以下情况中进行排序:
> str1<-"{a{b}{c}}"
> str2<-"{b{a}{c}}"
由于在上面的例子中{a}是根,而{b}和{c}是{a}的等级孩子。
答案 0 :(得分:1)
这是一个提示 - 有资格进行交换,你不要求“父”是相同的,只要“生成”(树的级别或深度)是相同的。您可以从{
减去}
的计数中获得此深度。我不明白你的大括号惯例,但只要它是统一的,那么它应该识别同一代的成员。
> str1<-"{a{b}{c{{d}{e}}}}"
> require(stringr)
> str_match <- str_extract_all(str1,"\\w+")[[1]]
> str_match
[1] "a" "b" "c" "d" "e"
> str_loc <- str_locate_all(str1,"\\w+")[[1]]
> str_loc
start end
[1,] 2 2
[2,] 4 4
[3,] 7 7
[4,] 10 10
[5,] 13 13
> prior_str <- str_sub(str1, end=str_loc[,'start'])
> prior_str
[1] "{a" "{a{b" "{a{b}{c" "{a{b}{c{{d" "{a{b}{c{{d}{e"
> str_depth <- str_count(prior_str,"[{]") - str_count(prior_str,"[}]")
> str_depth
[1] 1 2 2 4 4
希望你知道足够的R从那里拿走它。