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

Get the position of word pairs in a string of words

我有一串字:

spring java spring spring spring javescript java jboss jboss tomcat jboss

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

  1. 组合对
  2. 下一对

我会分词

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 个相邻对 (2, 3)(3,4)

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

我想你是从一组单词开始的。

您应该跟踪已处理的单词,例如将它们添加到 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。如果我理解有误,请澄清问题。

有很多复杂的方法可以做到这一点,最容易理解的方法是:

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!
  }
}

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

这应该可以做到...

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>();

遍历源数组(变量"test")并提出适当的问题...

            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();
        }
    }
}

... 似乎至少给出了预期的输出(尽管问题并没有在所有比赛中得到很好的回答)。

希望如果您的理解正确,您应该已经意识到这个答案中的所有代码加在一起就是一个完整的控制台应用程序,它将在 运行.

时实现您想要的功能