首页 新闻 搜索 专区 学院

C#如果高效的对一个段落断句?

0
悬赏园豆:50 [已解决问题] 解决于 2012-06-27 02:55

全部欧洲足协成员国如要到场欧洲足球锦标赛决赛周,除了主办国能够自动晋身决赛周除外,其余球队不必要到场外围赛,透过外围赛赛事,成就最佳的球队能够晋身决赛周。赛事早先只有四支球队到场,直至1980年参赛球队增至八队,同时决赛周赛事由本来只有镌汰赛参加小组赛阶段。及后1996年增长至十六支球队并保留至今。现时欧洲足球锦标赛由十六支球队分红四组,每组各有四支球队,每组辨别进行单循环赛制,每个小构成就最佳的球队能够出线半准决赛。半准决赛及准决赛均以一场过决议出胜方,直至决赛决议出冠军球队,但卫冕冠军不会得到下一届欧洲足球锦标赛决赛周参赛席位。因为欧洲足球锦标赛的范围及角逐质素仅次于天下杯足球赛,因而被人们称为缺少巴西和阿根廷的天下杯。

-------------------------------------------------------------------------------------

比如像上面的一个段落如果里面有多个句子即随机以一个句号断成两个段落。但是如果这个段落中没有多个句子但有多个逗号就以中间一个逗号断句。现在我是用的方法是判断段落中有没有句号与逗号,如果有我就分割文本处理。但是这样感觉不高效所以请问一下大家有没有好的分割的办法。

风灵波的主页 风灵波 | 初学一级 | 园豆:4
提问于:2012-06-23 01:54
< >
分享
最佳答案
0

既然有句号和没有句号逻辑不同,那么毫无疑问需要遍历整个string,最起码是O(N)。代码大概是这样(手写未测试,时间复杂度O(N)):

var article = "全部欧洲足协成员国....";
var commaIndexes = new List<int>(); //记录逗号位置
var dotIndexes = new List<int>();  //记录句号位置

for(int i = 0; i < article.Length; i++)
{
      if (article[i] == '.') dotIndexes.Add(i);
      else if (article[i] == ',') commaIndexes.Add(i);
}

if (dotIndexes.Count == 0)
{
      //没有句号
      var p1 = article.SubString(0, commaIndexes[commaIndexes.Count / 2]);
      var p2 = ... //类似,自己截
}
else 
{
     //有句号
     var p1 = article.SubString(0, dotIndexes[new Random().Next(0, dotIndexes.Count));
     var p2 = ....
}
收获园豆:30
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-06-23 11:08
其他回答(1)
0
       string m = "";
            string[] m1 ;
            string[] m2 = new string[2];
            if (m.IndexOf('.') == -1)
            {
                m1 = m.Split(',');
                if (m1.Length > 0) {
                    int i = m1.Length / 2;
                   m2[0]=string.Join("", m1.Take(i));
                   m2[1] = string.Join("", m1.Skip(i).Take(m1.Length-i));
                }
            }
            else { 
                m1=m.Split('.');
            }
收获园豆:20
無限遐想 | 园豆:3740 (老鸟四级) | 2012-06-24 08:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册