反转一个字符串句子(不一定是每个句子之间的空格)

时间:2015-05-03 08:53:20

标签: c# .net

我有这个字符串:

com.example.is-this@myname

我希望它是

myname@this-is.example.com

使用.Net,但直接的概念或想法会很好。

我目前正在做的是遍历每个角色,找出它是否是“特殊字符”之一,并将所有先前的字符分配给数组的变量,最后,我将它们连接在一起从最后到第一。

是否有更有效的方法可以做到这一点?

3 个答案:

答案 0 :(得分:9)

这是经典的逐字反转,在分隔符上有一点点扭曲。这个问题的解决方案是单独反转每个单词,然后反转整个字符串。在翻转单词时不要触摸分隔符。

第一步如下:我们找到每个令牌的限制,并将其反转到位,如下所示:

  1. com.example.is-this@myname
  2. moc.example.is-this@myname
  3. moc.elpmaxe.is-this@myname
  4. moc.elpmaxe.si-this@myname
  5. moc.elpmaxe.si-siht@myname
  6. moc.elpmaxe.si-siht@emanym
  7. 反转结果以获得所需的输出:

    moc.elpmaxe.si-siht@emanym -> myname@this-is.example.com
    

    就实现而言,您可以通过将字符串转换为字符数组以使其在适当位置更改来执行此操作,并编写一个简短的辅助方法,使您可以反转char数组的一部分在索引ij之间。有了这个辅助方法,你需要做的就是找到分隔符并为每个分隔的单词调用帮助器,然后进行最后一次调用以反转整个句子。

答案 1 :(得分:1)

您可以使用Split C#方法。

以下示例来自here

using System;

class Program
{
    static void Main()
    {
        string s = "there is a cat";
        // Split string on spaces.
        // ... This will separate all the words.
        string[] words = s.Split(' ');

        foreach (string word in words)
        {
            Console.WriteLine(word);
        }
    }
}

就像例子一样简单。

然后您为Split()

添加更多条件
string [] split = strings .Split(new Char [] {'.' , '@', '-' }, 
                                 StringSplitOptions.RemoveEmptyEntries);

RemoveEmptyEntries只会删除数组中不需要的空条目。

之后,您使用Array.Reverse method转换数组。

然后你可以用Foreach循环将你的弦拼接回来。

作为评论中提到的@marjan-venema,您可以在此处使用每个分隔符填充并行数组。反转它,然后在每个条目使用Foreach循环时连接字符串。

答案 2 :(得分:0)

以下是另一种使用List的方法,它有一个方便的Insert方法,以及Reverse方法。

Insert方法允许您继续将字符添加到列表中的相同索引(以及将其移动到更高索引之后的其他索引)。

因此,当您阅读原始字符串时,您可以在开头继续插入字符。一旦你来到一个分界仪,你将它添加到末尾并调整你的插入位置就在分隔符后面。

完成后,您只需拨打Reverse并将字符加回字符串:

public static string ReverseWords(string words, char[] wordDelimeters)
{
    var reversed = new List<char>();
    int insertPosition = 0;

    for(int i = 0; i < words.Length; i++)
    {
        var character = words[i];

        if (wordDelimeters.Contains(character))
        {
            reversed.Add(character);
            insertPosition = i + 1;
            continue;
        }

        reversed.Insert(insertPosition, character);
    }

    reversed.Reverse();
    return string.Join("", reversed);        
}