在一串单词中获取单词对的位置

时间:2017-11-03 12:35:56

标签: c# string delimiter

我有一串话:

spring java spring spring spring javescript java jboss jboss tomcat jboss

我必须使用空格作为分隔符来分解此字符串,然后我需要找到两种类型的对

  1. 组合对的
  2. 接着与对
  3. 我知道如何分手

    string text = "spring java spring spring spring javescript java jboss jboss tomcat jboss";
    string[] list = text.Split(' ');
    

    它工作正常,但我不知道从哪里开始寻找对,输出应该是这样的:

    spring:6个组合对(0,2)(0,3)(0,4)(2,4)(3,4)和2个next-to-pair(2,3)(3,4) )

    所以简而言之,它必须打印出单词,然后打印出与其相关的所有其他单词的位置,然后继续下一个单词并打印其余单词相对于新单词的位置,我试过了将每个单词添加到Dictionary并将它们的索引添加到另一个字典并将它们与原始数组进行比较并得到索引但我感到很困惑,我不知道该做什么或从哪里开始,任何建议或者可能是一个方向来研究?如果可能,我不想要答案,我只想要一个指南?

3 个答案:

答案 0 :(得分:2)

应该这样做......

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {

为每个结果项定义一个容器......

        class IndexPair
        {
            public int Index1 { get; set; }
            public int Index2 { get; set; }
        }

好的,让我们这样做......

        static void Main(string[] args)
        {

声明我们要测试的字符串和一些结果集来存储结果......

            var testString = "spring java spring spring spring javescript java jboss jboss tomcat jboss";
            var test = testString.Split(' ');
            var pairs = new List<IndexPair>();
            var comboPairs = new List<IndexPair>();

循环遍历源数组(变量&#34; test&#34;)并提出相应的问题......

            for (int i = 0; i < test.Length; i++)
                for (int j = 0; j < test.Length; j++)
                    if (j > i && test[i] == test[j])
                    {
                        var pair = new IndexPair { Index1 = i, Index2 = j };
                        pairs.Add(pair);

                        if (j == (i + 1)) comboPairs.Add(pair);
                    }

输出结果......

            Console.WriteLine("Input string: " + testString);
            Console.WriteLine("Word pairs: " + string.Join(" ", pairs.Select(p => $"{p.Index1},{p.Index2}")));
            Console.WriteLine("Combo pairs: " + string.Join(" ", comboPairs.Select(p => $"{p.Index1},{p.Index2}")));
            Console.ReadKey();
        }
    }
}

...似乎至少给出了预期的输出(即使这个问题并没有在所有比赛中得到满足)。

希望如果您遵循该权利,您应该已经意识到此答案中的所有代码都是一个完整的控制台应用程序,可以在运行时实现您想要的效果。

答案 1 :(得分:0)

有很复杂的方法可以做到,容易理解的方法是:

string[] words = text.Split(' ');
for(int i=0; i<words.Length; i++){
  for(int j=i+1; j<words.length; j++){
    if(words[i] == words[j]){
      //You have a match, do your stuff here!
    }
  }
}

你要做的就是每个单词,检查下一个单词以及之后直到匹配的文本结尾并记下它们的索引(分别为i和j)。

这适用于组合:

string[] words = text.Split(' ');
for(int i=0; i<words.Length-1; i++){
  if(words[i] == words[i+1]){
    //You have a match, do your stuff here!
  }
}

这样你就知道2个相邻的单词是否相等。

答案 2 :(得分:-1)

我想你从一系列词开始。

您应该跟踪已经处理过的单词,例如将它们添加到HashSet。从前到后迭代数组,对于每个尚未处理的单词,开始处理:

  • 创建所有单词索引的列表。对于您的示例,单词spring将具有索引

    0, 2, 3, 4

  • 将每个索引与以下索引组合成对:

    (0, 2), (0, 3), (0, 4), (2, 3), (2, 4), (3, 4)

  • 通过检查其索引差异是否为1

    ,将您的对分割为Next-To-Pair和Combo-pair

    (2, 3), (3, 4)

    (0, 2), (0, 3), (0, 4), (2, 4)

注意我不知道为什么你在问题中列出了(3, 4)作为Combo-Pair,据我所知,它应该是一个Next-to-Pair。如果我误解了,请澄清问题。