String.Split VS. Regex.Split?

Ваш код на самом деле правильный, недостающая часть - просто вы забыли проверить заголовок связанного списка.

У меня проблема с тем, что я хочу удалить узел, но он все еще там, когда я печатаю список

Я не уверен, почему вы не можете удалить узел. Проверьте значения, так как, возможно, они различаются в своем регистре (одно в нижнем регистре, а другое в верхнем регистре). Но если вас не волнуют случаи, просто измените метод вставки и преобразуйте все слова, которые нужно вставить, в нижний / верхний регистр.

Я только что немного подкорректировал ваш код. См. Ниже:

    public void REMOVEWORD(String word) {
        // declare and initialize a help pointer
        Word helpPtr = head;

        // ADD THIS PART (START)
        if (helpPtr.getWord().equals(word)) { // check if the head is the to be removed word
            head = helpPtr.getNext(); // if true then set head to head.getNext()
            return;
        }
        // ADD THIS PART (END)

        while (helpPtr.getNext() != null) { // iterate through the linkedlist
            if (helpPtr.getNext().getWord().equals(word)) { // check if the next node is the word to be removed
                Word next = helpPtr.getNext().getNext(); // if true then get the next node of the next node
                helpPtr.setNext(next); // set the next of the current node to the acquire node above
                // subtract the frequency of the word to be deleted from the list
                // int total = helpPtr.getNext().getFrequency() - countWords; // NOT SURE WHAT
                // THIS CODE WILL DO SO I JUST COMMENTED IT OUT
                break;
            }
            helpPtr = helpPtr.getNext();
        }
    }
14
задан gotqn 1 July 2015 в 07:35
поделиться

3 ответа

Regex.Split имеет больше возможностей, но для расположения с базовым разделителем (с использованием символа, который не будет существовать больше нигде в строке) гораздо проще работать с функцией String.Split. .

Что касается производительности, вам придется создать тест и протестировать его. Но не выполняйте предварительную оптимизацию, если вы не знаете, что эта функция будет узким местом для какого-то важного процесса.

14
ответ дан 1 December 2019 в 13:07
поделиться

Кажется, что для простых сценариев string.Split() работал бы намного лучше. Я запустил тест в Сравнительном тесте.NET

Протестированный на.NetCore 2.2.6:

|     Method |      Mean |    Error |   StdDev |    Median |
|----------- |----------:|---------:|---------:|----------:|
| RegexSplit | 486.47 ns | 9.769 ns | 24.15 ns | 481.72 ns |
|      Split |  84.76 ns | 4.503 ns | 13.21 ns |  81.12 ns |

Тест:

public class RegexVsSplit
{
    private readonly string data = "host:7000";

    public RegexVsSplit()
    {
    }

    [Benchmark]
    public string[] RegexSplit() => Regex.Split(data, ":");

    [Benchmark]
    public string[] Split() => data.Split(':');
}
1
ответ дан 1 December 2019 в 13:07
поделиться

По умолчанию я бы использовал String.Split, если только у вас нет сложных требований, по которым регулярное выражение позволит вам перемещаться. Конечно, как уже упоминалось, профилируйте его для своих нужд. Обязательно профилируйте с RegexOptions.Compiled и без него и поймите, как это работает. Посмотрите Компилировать или не компилировать, Как работает RegexOptions.Compiled? и найдите другие статьи по этой теме.

Одним из преимуществ String.Split является его StringSplitOptions.RemoveEmptyEntries , который удаляет пустые результаты в случаях, когда между разделителями нет данных. Шаблон регулярного выражения той же разделенной строки/символа будет иметь лишние пустые записи. Это незначительно и может быть обработано простым запросом LINQ для фильтрации результатов String.Empty.

Тем не менее, регулярное выражение позволяет чрезвычайно легко включить разделитель, если вам это нужно.Это достигается добавлением круглых скобок () вокруг шаблона, чтобы сделать его захватываемой группой. Например:

string input = "a|b|c|d|e|f";
foreach (var s in Regex.Split(input, @"\|"))
    Console.WriteLine(s);

Console.WriteLine("Include delimiter...");
// notice () around pattern
foreach (var s in Regex.Split(input, @"(\|)"))
    Console.WriteLine(s);

Вам также может быть полезен этот вопрос: Как мне разделить строку на строки и включить разделители с помощью .NET?

4
ответ дан 1 December 2019 в 13:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: