【问题标题】:Get the position of word pairs in a string of words获取单词对在一串单词中的位置
【发布时间】:2017-11-03 12:35:55
【问题描述】:

我有一串单词:

spring java spring spring spring javescript java jboss jboss tomcat jboss

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

  1. 组合对
  2. 下一对

我知道怎么拆词

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

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

弹簧:6 个组合对 (0,2)(0,3)(0,4)(2,4)(3,4) 和 2 个相邻对 (2,3)(3,4) )

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

【问题讨论】:

  • 是您提供的确切输出吗?我说要清除它,将确切的输出添加到代码块中的字符串中,例如expectedOutput = " . . . "
  • 组合对如何:(2,3) ?
  • 对于组合对,对于数组中的每个元素都期待找到匹配的索引。对于 next-to-pairs,对于数组中的每个元素,查看下一个元素是否相同。
  • @Mong Zhu 好像忘记那个了。
  • @Adam 但我如何获得输出中每个单词的位置,这是我的主要问题

标签: c# string delimiter


【解决方案1】:

应该这样做...

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

... 似乎至少给出了预期的输出(即使问题并没有在所有匹配项上都得到充分体现)。

希望如果您遵循了正确的做法,您应该已经意识到这个答案中的所有代码组合在一起是一个完整的控制台应用程序,它将在运行时实现您想要的。

【讨论】:

  • 它有效,我只需要组合输出,以便它打印特定单词的结果,而不是打印特定对的结果,但它确实给了我所需的输出
  • 你是说你想要带索引的单词吗?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我想你从一个单词数组开始。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      相关资源
      最近更新 更多