Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 8
.NET 4.x

Метод Split() отказывается работать

10.05.2019, 13:48. Показов 2037. Ответов 2

Студворк — интернет-сервис помощи студентам
Описание программы: Поступает на вход текстовый файл в формате(слово + " " + число)(пример на фото). Программа должна повторяющиеся слова объединить и соответственно сложить при этом сопоставимые им числовые значения.
Т.е., если было:
word 1
dog 3
word 2,
то получитсля:
word 3
dog 3

См.строка 50!!! Метод split отказывается работать(в параметре к split поступает пробел, погружается это в созданный только что строковый массив(см.строка 50), т.е. по идее, в 1-ой ячейке должно быть слово, а во 2-ой должно быть число(как и в приведенном примере!!!)). Но VS при запуске отладчика ругается, когда я хочу обратиться к сосплитинной строке(переменная splited), а именно, он мне выдает, что индекс 1 находится вне границ массива splited(переменная)...

Что самое странное в других двух прогах аналогичных этой(в первой: берется похожий файл на вход только без повторений слов и выводится слова с большим числом рядом; во второй: берется текст на вход, по окончанию работы программы генерируется еще один *.txt файл с анализом - какое слово и сколько раз было встречено) все работает прекрасно с функцией один в один(здесь она названа getWords).

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
using System;
using System.IO;
using System.Collections.Generic;
 
namespace cSharp_Analytics1_
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] originalLines = File.ReadAllLines("original.txt");
            List<string> updateLines = new List<string>();
            for (int i = 0; i < originalLines.Length; i++)
            {
                for (int k = i; k < originalLines.Length; k++)
                {
                    if (getWords(originalLines[i]) == getWords(originalLines[k]))
                    {
                        originalLines[i] = ToUpdateCount(originalLines[i], ref originalLines[k]); 
//ref стирает наше повторяющуюся строку, чтобы потом не было повторяющихся слов.
                    }
                }
                updateLines.Insert(i,originalLines[i]);
//создание списка с обновленными строками(слово + обновленное число его повторений)
            }
 
            string[] endUpdateText = updateLines.ToArray();
            File.WriteAllLines ("update.txt", endUpdateText);
        }
 
        static string ToUpdateCount(string line1, ref string line2)
        {
            string[] lineArr1 = line1.Split(' ');
            string[] lineArr2 = line2.Split(' ');
            string words = lineArr1[0];
            int updateCount = Convert.ToInt32(lineArr1[1]) + Convert.ToInt32(lineArr2[1]);
            line1 = words + " " + Convert.ToString(updateCount);
            line2 = "";
            return line1;
        }
        static int getCount(string lines)
        {
            string[] splited = lines.Split(' ');
            string words = splited[0];
            int count = Int32.Parse(splited[1]);
            return count;
        }
        static string getWords(string lines)
        {
            string[] splited = lines.Split(' ');
            string words = splited[0];
     int count = Convert.ToInt32(splited[1]); //int count = Int32.Parse(splited[1]) // пробовал и TryParse, заносит 0 
            return words;
        }
    }
}
Миниатюры
Метод Split() отказывается работать  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2019, 13:48
Ответы с готовыми решениями:

Метод Split
Хочу с помощью метода Split заполнить матрицу Math. Компилятор мне не дает , и получается откомпилировать только одномерный массив. Может...

Метод .split()
Итак, помогите пожалуйста написать метод сплит, или скопипастьте мне его код, пожалуйста. Просто мне сказали не пользоваться сплитом, а...

Метод Split
Захотел сделать в кликере что то типо команды на деньги, ловит ошибку (catch) Код: try { ...

2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
10.05.2019, 14:52
Лучший ответ Сообщение было отмечено x_NevrroX_x как решение

Решение

Цитата Сообщение от x_NevrroX_x Посмотреть сообщение
См.строка 50!!! Метод split отказывается работать
Он прекрасно работает.
Просто у Вас нарушена логика работы.
В строкеoriginalLines[i] = ToUpdateCount(originalLines[i], ref originalLines[k]); Вы затираете данные , а потом в другом цикле эти данные (то есть пустую строку) опять отправляете в Split. И естественно ловите ошибку.

Сам алгоритм у Вас концептуально сделан не верно. Разделяйте код на отдельные блоки.
Задача у Вас состоит из следующих этапов-блоков:
  • Получить список строк.
  • Преобразовать каждую строку в сочетание (ключ, значение)
  • Объединить все записи с одним ключом просуммировав их значение

И реализуйте эти этапы отдельно, независимо друг от друга.

Пример (без использования методов):
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
    string[] originalLines = File.ReadAllLines("original.txt"); // Все линии
 
    List<(string key, int value)> listKeyValue = new List<(string key, int value)>();
    {
        // Парсинг строк
        foreach (string line in originalLines)
        {
            // Получение подстрок с удалением пустых
            string[] subStrings = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            // Проверка полученных подстрок
            if (subStrings.Length > 1 && int.TryParse(subStrings[1], out int val))
                listKeyValue.Add((key: subStrings[0], value: val)); // Добавление разобранной строки
        }
    }
 
    Dictionary<string, int> updateLines = new Dictionary<string, int>(); // Выходной результат
    {
        // Объединение строк с одним ключом
        foreach ((string key, int value) line in listKeyValue)
        {
            // Проверка наличия ключа
            if (updateLines.TryGetValue(line.key, out int val))
                updateLines[line.key] = val + line.value;
            else
                updateLines.Add(line.key, line.value);
        }
 
    }
 
    //List<string> updateLines = new List<string>();
    //for (int i = 0; i < originalLines.Length; i++)
    //{
    //    for (int k = i; k < originalLines.Length; k++)
    //    {
    //        if (getWords(originalLines[i]) == getWords(originalLines[k]))
    //        {
    //            originalLines[i] = ToUpdateCount(originalLines[i], ref originalLines[k]);
    //            //ref стирает наше повторяющуюся строку, чтобы потом не было повторяющихся слов.
    //        }
    //    }
    //    updateLines.Insert(i, originalLines[i]);
    //    //создание списка с обновленными строками(слово + обновленное число его повторений)
    //}
 
    //string[] endUpdateText = updateLines.ToArray();
 
    string resultLines = string.Join("\r\n", updateLines.Select(item => $"{item.Key} {item.Value}"));
    Console.WriteLine(resultLines);
    File.WriteAllText("update.txt", resultLines);
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
10.05.2019, 15:09
Используя LINQ можно всё сделать короче
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    string[] originalLines = File.ReadAllLines("original.txt"); // Все линии
 
    string resultLines = /*new List<(string key, int value)>();*/
        originalLines
        .Select(line => line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
        .Where(sub => sub.Length > 1)
        .Select(sub => (key: sub[0], value: int.TryParse(sub[1], out int val) ? val : (int?)null))
        .Where(keyValue => keyValue.value != null)
        .GroupBy(keyValue => keyValue.key)
        .Select(group => $"{group.Key} {group.Sum(item => item.value.Value)}")
        .Aggregate((acum, str) => acum + "\r\n" + str);
    Console.WriteLine(resultLines);
    File.WriteAllText("update.txt", resultLines);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2019, 15:09
Помогаю со студенческими работами здесь

Метод Split
Ребята, я вообще не понимаю, как это реализовать? &quot;При помощи метода Split() разобрать исходную строку на слова в виде массива строк....

Метод Split
Есть строка - &quot;Вася кит помидор деревня...&quot;-(обычное предложение вообщем) Как можно предложение &quot;рассклеить&quot; ? Понимаю что...

Написать метод split
Напишите метод split, который из параметра name типа string, хранящего имя и фамилию человека, извлекает их в параметры first и last типа...

Метод split и текстовый файл
Подскажите: Дан текстовый файл, состоящий из одной строки. Строка файла содержит числа, разделённые пробелами. Проверить, содержится ли...

Почему не работает метод Split
string param = &quot;5?5&quot;; char ch = '?'; string par = param.Split(ch); //null Что такого в знаке вопроса, что аж не может разбить строку?...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru