Страница: 1 |
Страница: 1 |
Вопрос: работа со строками в аду
Добавлено: 01.02.08 22:36
Автор вопроса: Skywalker | Web-сайт:
Никогда еще не было таких сложных и непонятных проблем.
Имеется массив строк, требуется найти все одинаковые разновидности. Для этого я решил отсортировать его, тогда все одинаковые будут группами стоять вместе.
Array.Sort(mass) отсориторвало мне не правильно. Написал свою функцию сравнения, сортирует тоже не правильно, но лучше:
Private Function compare(ByVal a As String, ByVal b As String) As Boolean
Dim tmp As Integer
tmp = Math.Min(a.Length, b.Length)
For i As Integer = 0 To tmp - 1
If Convert.ToInt32(a.Chars(i)) > Convert.ToInt32(b.Chars(i)) Then
Return True
ElseIf Convert.ToInt32(a.Chars(i)) < Convert.ToInt32(b.Chars(i)) Then
Return False
End If
Next
If a.Length > b.Length Then Return True
Return False
End Function
до этого были варианты
If a.Chars(i) > b.Chars(i)
If char.GetNumericValue(a.Chars(i)) > char.GetNumericValue(b.Chars(i))
но они раюотают хуже
как я сказал, сортировка происходит все равно не правильно, но лучше, чем в других случаях:
For i = 0 To mass.Length - 2
For j = i + 1 To mass.Length - 1
If compare(mass(i), mass(j)) Then
Dim tmp As String = mass(i)
mass(i) = mass(j)
mass(j) = tmp
End If
Next
Next
далее ищу эти самые одинаковые группы и пишу во второй массив
Dim str As String
str = mass(0)
n = 1
i = 0
While n < mass.Length
If str <> mass(n) Then
str = mass(n)
n += 1
Else
If Array.IndexOf(mass2, str) >= 0 Then
n += 1
Else
mass2(i) = str
i += 1
End If
End If
End While
не находит некоторые группы
при изменении условия на If String.Compare(str, mass(n))
находит больше, но все равно не все. Что здесь творится?!
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
D o c a l
ICQ: 408802757
Вопросов: 76
Ответов: 985
Web-сайт:
Профиль | | #1
Добавлено: 01.02.08 23:50
Pokazhu primer kakiye stroki v masive yest i kak nada zdelat
Номер ответа: 2
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #2
Добавлено: 02.02.08 02:47
Docal +1
Покажи пример строк, поможем.
Номер ответа: 3
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #3
Добавлено: 02.02.08 15:06
ну у меня там 229 строк, приведу частично
дано:
Hью-Инглaнд - H.Й. Джaйентс
Aтлeтик Б - Раcинг
Атлетик Б (1-й тайм) - Paсинг (1-й тайм)
Aтлeтик Б (2-й тайм) - Расинг (2-й тaйм)
Бaрcелoнa - Вильярреал
Баpceлoнa (1-й тaйм) - Вильярpеaл (1-й тайм)
Баpceлoна (2-й тaйм) - Вильярpeaл (2-й тaйм)
Cиенсиано - Уондеpepс
Ольмeдo - Лaнyc
Зeнит - Вильяpреал
Mapсель - Спартaк M
Булонь - Tyaр
Cтрacбуp - Mетц
Ливepпуль - Интep M
Олимпиакоc - Челси
Pома - Pеaл Мадрид
Шaльке-04 - Пoрту
Арсeнал Л - Mилан
Лиoн - Манчестеp Юн.
Сeлтик - Бapcелoна
Фенeрбахче - Сeвилья
ВИЗ-Синapа - Динамo M
МФK Tюмень - MФК Липeцк
MФK Mытищи - Спaртaк-Щелкoвo
Дина - Пoлитex
TТГ-Явa - Динaмо CПб
Андeрлeхт - Дeндер
....
сортирует примерно так:
Apминия Б - Вольфcбypг
AЗ Aлкмаp - ПCВ Эйндхoвен
Aкaсyсо - Кyэвaс
Aкадeмика - Maритиму
Aраy - Ст. Галлен
Aтлeтик Б (2-й тайм) - Расинг (2-й тaйм)
Aтлeтик Б - Раcинг
Aякc - Фейенооpд
Cepкль Бpюггe - Cтандaрд
Ceтубaл - Навал
Cиeна - Poмa
Cиенсиано - Уондеpepс
Cпapта - Cтopxaмap
Cпaрта Р - Венло
Cт. Tруйдeн - Бpюгге
Cтрacбуp - Mетц
Haполи - Удинезe
Hью-Инглaнд - H.Й. Джaйентс
Hэшвилл - Koлaмбуc
Keндрик - Рам Р
Koблeнц - Mайнц
Kарл-Цeйсc Йенa - Aаxен
...
Авангард - СКА
Айлeндеpс - Лoс-Aнджeлес
Ак Барс - ЦСКА
Акасусо - Куэвас
Альмеpия - Рeал Мaдpид
Альмерия - Реал Мадрид
Альмерия - Реал Мадрид
Амадоpа - Бpагa
Андeрлeхт - Дeндер
Арминия - Вольфсбург
Арминия - Вольфсбург
Арсeнал Л - Mилан
Арсенал - Милан
Атлетик Б (1-й тайм) - Paсинг (1-й тайм)
Атлетико Мaдpид - Муpсия
Атлетико Мадрид - Мурсия
Атлетико Мадрид - Мурсия
Атрoмитос - Kсaнти
Атромитос - Ксанти
...
дальше вродь по алфавиту пошел, но точно не уверен.
а потом во второй массив пишу чо повторяеца, то есть из приведенного куска должно быть:
Альмеpия - Рeал Мaдpид
Арминия - Вольфсбург
Атлетико Мaдpид - Муpсия
Атрoмитос - Kсaнти
вот так вот...
сначала думал, что возможно в строках встречаются английские буквы похожие на русские, вставил замену на русские, все равно также.
когда трассировал видел такой идиотизм в функии compare что сравниваюца буквы "А" и "А" и выполняется условие, что одна из них меньше другой
ElseIf Convert.ToInt32(a.Chars(i)) < Convert.ToInt32(b.Chars(i)) Then
Return False
End If
Номер ответа: 4
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #4
Добавлено: 02.02.08 15:08
А какие критерии сортировки , что из себя представляют группы ? Приведи пример желаемого результата и то , что имеешь до сортировки
Номер ответа: 5
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #5
Добавлено: 02.02.08 18:48
вот сейчас смотрю, сравниваются строки
"Aтлeтик Б (2-й тайм) - Расинг (2-й тaйм)"
и
"Арсeнал Л - Mилан"
погнали, первые буквы "А" и "А" у одной код 65 у другой 1040
t1 = Convert.ToInt32(a.Chars(i))
t2 = Convert.ToInt32(b.Chars(i))
почему так?
Номер ответа: 6
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #6
Добавлено: 02.02.08 18:54
посмотрел таблицу символов - одна А латинская, а другая русская. Но я ведь сделал до сортировки массива
For i = 0 To mass.Length - 1
mass(i).Replace("A", "А"
mass(i).Replace("a", "а"
mass(i).Replace("C", "С"
mass(i).Replace("c", "с"
mass(i).Replace("H", "Н"
mass(i).Replace("e", "е"
mass(i).Replace("E", "Е"
mass(i).Replace("Y", "У"
mass(i).Replace("O", "О"
mass(i).Replace("o", "о"
mass(i).Replace("P", "Р"
mass(i).Replace("p", "р"
mass(i).Replace("K", "К"
mass(i).Replace("k", "к"
mass(i).Replace("X", "Х"
mass(i).Replace("x", "х"
mass(i).Replace("B", "В"
mass(i).Replace("M", "М"
Next
слева написал все английские, справа все русские
:_(
Номер ответа: 7
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 02.02.08 21:45
Array.Sort неправильно сортирует строки???
Автор, поделись травой пожалуйста!
А лучше сразу езжай в Редмонд и научи програмеров как правильно сортировку писать, а то совсем они там разленились видимо
Номер ответа: 8
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #8
Добавлено: 02.02.08 21:51
проблема в replace
Номер ответа: 9
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #9
Добавлено: 02.02.08 22:33
Попробуй что-нибудь типа mass(i).Replace(Chr(65), Chr(1040)).
Номер ответа: 10
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #10
Добавлено: 02.02.08 23:27
не катит, также не дает результата
Replace(mass(i), "A", "А", 1, -1, CompareMethod.Text)
Replace(mass(i), "A", "А", 1, -1, CompareMethod.Binary)
может баг кроется вообще в чем-то другом?
Номер ответа: 11
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #11
Добавлено: 02.02.08 23:34
ой я идиооооот, простите все. тока щас дошло, что пишу вообще тупо
mass(i).Replace("A", "А"
а нада
mass(i) = mass(i).Replace("A", "А"
как я так мог натупить
Номер ответа: 12
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #12
Добавлено: 03.02.08 00:24
Попробуй так, может подойдет.
Вообще здесь напрашивается рекурсия , но я решил поэкспериментировать , код конечно не идеален , но тут уж сам. Особое внимание на ввод данных . а именно (пробел-пробел)
(“ – “) введешь хоть в одном месте не правильно получишь сбой . Здесь тоже сам, создай контроль ввода текста
В TextBox1 ввёл так:
сергей - москва
вова - орёл
андрей - прага
сергей - дон
сергей(1 тур) - москва
вова - гдов
вова(2тур) - гдов
андрей самсонов – питер
В TextBox2 получил так :
андрей - прага
андрей самсонов - питер
вова - гдов
вова - орёл
вова(2тур) - гдов
сергей - дон
сергей - москва
сергей(1 тур) – москва
Вот код :
Public Class Form1
Inherits System.Windows.Forms.Form
Код, автоматически созданный конструктором форм Windows
 im ВыводнойCписок As New ArrayList
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 im strArrayНовый() As String
 im i, charsInFile, lineCount, curline As Integer 'Short
 im ln, letter As String
 im Список As New ArrayList
 im Дочь As String
 im КорткийСписок As New ArrayList
lineCount = 1
charsInFile = TextBox1.Text.Length
'определяем число строк объекта текстового поля
For i = 0 To charsInFile - 1 'берем по одному символу
letter = TextBox1.Text.Substring(i, 1) 'получаем символ
If letter = Chr(13) Then 'если нашли возврат каретки
lineCount += 1 'переходим на следующую строку (увеличиваем счетчик)
i += 1 'пропускаем символ перевода строки
'(всегда следует за возвратом каретки)
End If
Next i
'создаем массив для хранения текста из текстового поля
ReDim strArrayНовый(lineCount + 1) 'создаем массив требуемого размера
curline = 1
ln = "" 'используем ln для посимвольного создания строк
For i = 0 To charsInFile - 1 'снова организуем цикл по тексту
letter = TextBox1.Text.Substring(i, 1) 'получаем символ
If letter = Chr(13) Then 'если нашли возврат каретки Chr(13) "="
curline = curline + 1 'увеличиваем счетчик строк
i += 1 'пропускаем символ перевода строки
ln = "" 'очищаем строку и переходим к следующей
Else
ln = ln & letter 'добавляем символ в строку
strArrayНовый(curline) = ln 'и помещаем в массив '& letter
End If
Next i
'ShellSort(strArray, lineCount)
Список.AddRange(strArrayНовый)
' Список.Sort()
' strArrayНовый.Sort(strArrayНовый) ' Сортировка массива
 im НовоеИмя As String
For Each Дочь In Список
If Дочь <> "" Then
НовоеИмя = Дочь.Substring(0, Дочь.IndexOf(" - ") 'Or Дочь.Substring(0, Дочь.IndexOf(" -")
КорткийСписок.Add(НовоеИмя)
' If Дочь.StartsWith(До
'TextBox2.Text &= НовоеИмя & vbCrLf
End If
Next
НайтиИмяМассива(КорткийСписок, strArrayНовый)
For Each Дочь In ВыводнойCписок 'ОкончательныйСписок
TextBox2.Text &= Дочь & vbCrLf
Next
End Sub
Sub НайтиИмяМассива(ByVal СписокИмён As ArrayList, ByVal Массив() As String)
 im Элемент As String
 im i As Integer
 im НовоеИмя, Имя As String
 im ОкончательныйСписок As New ArrayList
For Each Элемент In СписокИмён
For i = 0 To Массив.Length - 1
If Массив(i) <> "" Then
НовоеИмя = Массив(i).Substring(0, Массив(i).IndexOf(" - ").ToString
If Элемент.StartsWith(НовоеИмя) Then
ОкончательныйСписок.Add(Массив(i)).ToString()
Else
If i >= Массив.Length - 1 Then
i = i + 1
Else
i = i
End If
End If
End If
Next
Next
For Each Имя In ОкончательныйСписок
If ВыводнойCписок.Contains(Имя.ToString) = False Then
ВыводнойCписок.Add(Имя.ToString)
End If
Next
ВыводнойCписок.Sort()
End Sub
End Class
Номер ответа: 13
Автор ответа:
BUMM ®
Вопросов: 8
Ответов: 482
Профиль | | #13
Добавлено: 03.02.08 02:45
УЖОС Ж-(
Номер ответа: 14
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #14
Добавлено: 03.02.08 04:52
На мой взгляд, код должен быть из 5-6 строк. Может я, что-то не понимаю?
Что нужно сделать после сортировки массива? Или обьясни, что вообще нужно сделать?
Номер ответа: 15
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #15
Добавлено: 03.02.08 17:50
да уже вроде все работает нормально. всем спасибо