Ваш код на самом деле правильный, недостающая часть - просто вы забыли проверить заголовок связанного списка.
У меня проблема с тем, что я хочу удалить узел, но он все еще там, когда я печатаю список
blockquote>Я не уверен, почему вы не можете удалить узел. Проверьте значения, так как, возможно, они различаются в своем регистре (одно в нижнем регистре, а другое в верхнем регистре). Но если вас не волнуют случаи, просто измените метод вставки и преобразуйте все слова, которые нужно вставить, в нижний / верхний регистр.
Я только что немного подкорректировал ваш код. См. Ниже:
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(); } }
Regex.Split имеет больше возможностей, но для расположения с базовым разделителем (с использованием символа, который не будет существовать больше нигде в строке) гораздо проще работать с функцией String.Split. .
Что касается производительности, вам придется создать тест и протестировать его. Но не выполняйте предварительную оптимизацию, если вы не знаете, что эта функция будет узким местом для какого-то важного процесса.
Кажется, что для простых сценариев 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(':');
}
По умолчанию я бы использовал 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?