Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
1

Удалить из сообщения все повторяющиеся слова (без учета регистра)

10.12.2014, 19:35. Показов 3369. Ответов 7
Метки нет (Все метки)

Есть подобные темы, но решения нет.
Удалить из сообщения все повторяющиеся слова (без учета регистра).

Жирным выделена проблема. Можно использовать либо String, либо StringBuilder. Если использовать StringBuilder, то с регистром возникают трудности, если String, то проблемы с изменением строки.

Вот строка для примера:
Удалить из сообщения ИЗ все повторяющиеся слова (без учета регистра БЕЗ РЕГИСТРА)
После запуска программы должно получится
Удалить сообщения все повторяющиеся слова (учета )
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2014, 19:35
Ответы с готовыми решениями:

Удалить из сообщения все повторяющиеся слова (без учета регистра)
Приветствую! Очень нужна помощь, не могу разобраться. Надо написать программу, где нужно удалить...

Удалить из сообщения все повторяющиеся слова (без учета регистра)
Ребят здравствуйте! Вот код моей программы StreamReader sr =...

Удалить из сообщения все повторяющиеся слова (без учета регистра)
Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются...

Удалить из сообщения все повторяющиеся слова (без учета регистра)
Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются...

7
$ su
1604 / 519 / 97
Регистрация: 18.11.2010
Сообщений: 2,807
Записей в блоге: 2
10.12.2014, 20:37 2
всю строку ToLower просто
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
10.12.2014, 21:25 3
Можно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Text.RegularExpressions;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.IO;
 
class AdvancedTests
{  
    [STAThread]
    static void Main(string[] args)
    {
        string @in = "Удалить из сообщения ИЗ все повторяющиеся слова (без учета регистра БЕЗ РЕГИСТРА)";
        var hs = new HashSet<string>();
        string @out = Regex.Replace(@in, @"(?<Word>\w+)|\W+", Match => Match.Groups["Word"].Success ? (hs.Add(Match.Value.ToLower()) ? Match.Value : string.Empty) : Match.Value);
        Console.WriteLine(@out);
    }  
}
Хотя этот вариант вам наверно не подойдёт.
0
548 / 316 / 138
Регистрация: 08.02.2013
Сообщений: 609
10.12.2014, 21:48 4
maxillion,
C#
1
2
3
4
string @in = "Удалить из сообщения ИЗ все повторяющиеся слова (без учета регистра БЕЗ РЕГИСТРА)";
var hs = new HashSet<string>(StringComparer.CurrentCultureIgnoreCase);
string @out = Regex.Replace(@in, @"\w+", m => hs.Add(m.Value) ? m.Value : "");
Console.WriteLine(@out);
1
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
11.12.2014, 12:19  [ТС] 5
Цитата Сообщение от ntlinuxnt Посмотреть сообщение
всю строку ToLower просто
Тогда результирующая строка будет тоже в нижнем регистре, а там часть букв в верхнем. Т.о. она не будет нужной.

Цитата Сообщение от maxillion Посмотреть сообщение
Можно так
Это начальные уроки. Мы знаем только азы. Т.е. пока не можем использовать Regex и HashSet.

Буду делать через массив char...
0
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
12.12.2014, 13:27  [ТС] 6
Получилась такая программа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// III. Дана строка, в которой содержится осмысленное текстовое сообщение. Слова
// сообщения разделяются пробелами и знаками препинания.
// Замечание. При решении задач из данного пункта использовать тип string или StringBuilder.
// Свой выбор обосновать.
// 4. Удалить из сообщения все повторяющиеся слова (без учета регистра).
 
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication60
{
    class Program
    {
        static char[] splitter = { ' ', '[', ']', '(', ')', '{', '}', '*', ',', '.', ';', ':', '\u2026', '#', '=' };
 
        // 4. Удалить из сообщения все повторяющиеся слова (без учета регистра).
 
        static void Func_3_4(String s)
        {
            Console.WriteLine("\n{0} ", s);
            String str = "Удалить из сообщения ИЗ все повторяющиеся слова (без учета регистра БЕЗ РЕГИСТРА)";
            String strLow = str.ToLower();
            String newStr = String.Copy(str);
            String[] words = new String[s.Length];
 
            Console.WriteLine("Было:  {0}", str);
            
            words = strLow.Split(splitter);                    // Массив для поиска
            int start = 0; // Объявляем переменную для сохранения индекса
 
            for (int i = 0; i < words.Length; i++)
            {
                for (int j = i+1; j < words.Length; j++)
                {
                    if ((String.Compare(words[i], words[j]) == 0) && !String.IsNullOrEmpty(words[i]))
                    {
                    // если слово встречается
                    Console.WriteLine("'{0}' == '{1}'", words[i], words[j]);
                    // Удаляем все его вхождения
                    start = newStr.IndexOf(words[i]);
 
                    while (start != -1 && !String.IsNullOrEmpty(words[i])) // пока парное слово есть и оно не пустое
                    {
                        // Удаляем второе вхождение
                        str = str.Remove(start, words[i].Length); // !!! Наверное будет жрать память, но я не знаю, как этого избежать
                        newStr = str.ToLower();
                        Console.WriteLine("Новая строка: {0}", str);
                        start = newStr.IndexOf(words[i]);
 
                    }
                    // Обновляем массив слов    
                    strLow = str.ToLower();
                    words = strLow.Split(splitter);
                }
                else 
                {
                    // если слово не встречается можно что-то добавить
                }
 
            }
        }
            Console.WriteLine("Стало: {0}", str);
    }
 
static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
 
            s = "4. Удалить из сообщения все повторяющиеся слова (без учета регистра).";
            Func_3_4(s);
            Console.ReadKey();
        }
    }
}
0
Life Builder
529 / 493 / 374
Регистрация: 12.01.2011
Сообщений: 1,740
12.12.2014, 15:28 7
вот еще вариант. Будет работать нормально, только если нету символов соединенное словами(кроме пробелов)
C#
1
2
3
4
5
6
7
8
9
10
11
string str = "Удалить из сообщения ИЗ все повторяющиеся слова ( без учета регистра БЕЗ РЕГИСТРА )";
            string[] slova = str.Split(' ');
            StringBuilder sb = new StringBuilder();
 
            for (int i = 0; i < slova.Length; i++)
            {
                if (sb.ToString().ToLower().IndexOf(slova[i].ToLower()) == -1)
                    sb.Append(slova[i]+" ");
            }
 
            Console.WriteLine(sb);
1
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
12.12.2014, 15:47  [ТС] 8
Годится, но тогда я не совсем понял условие задачи.
"Удалить все повторяющиеся слова" - это те, которые являются повтором, или вообще все слова, которые повторяются?

В моем случае удаляются и первое слово 'из' и то, которое повторяется - 'ИЗ' и т.д.
Как правильно по логике вопроса?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2014, 15:47

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

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

Удалить из сообщения все повторяющиеся слова (без учета регистра) кроме первого вхождения
Здравствуйте, подскажите, что не так Использую для удаления one = string.Join(&quot; &quot;, one.Split('...

Удалить из сообщения все слова, содержащие данный символ (без учета регистра)
Удалить из сообщения все слова, содержащие данный символ (без учета регистра).


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru