以不同的顺序查找字符串中的字母

时间:2015-09-01 07:00:45

标签: r string sorting

我有两个代表树木的字符串。每个'{'意味着在树中降低等级(孩子)。 每个字符串包含字母(或单词)除以'{'一个或多个。 我想只转换相同级别的字母 - 第二个(或第一个)字符串与另一个字母的字母顺序相同而不改变字符串中的位置。 这是一个例子:

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}的等级孩子。

1 个答案:

答案 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从那里拿走它。