Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: работа со строками в аду Добавлено: 01.02.08 22:36  

Автор вопроса:  Skywalker | Web-сайт: iSkywalker.ru | ICQ: 300-70-6пятьЪ 
Никогда еще не было таких сложных и непонятных проблем.
Имеется массив строк, требуется найти все одинаковые разновидности. Для этого я решил отсортировать его, тогда все одинаковые будут группами стоять вместе.
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-сайт: www.doc-source.pp.net.ua/
 Профиль | | #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-сайт: iSkywalker.ru
 Профиль | | #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-сайт: iSkywalker.ru
 Профиль | | #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-сайт: iSkywalker.ru
 Профиль | | #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-сайт: iSkywalker.ru
 Профиль | | #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-сайт: iSkywalker.ru
 Профиль | | #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-сайт: iSkywalker.ru
 Профиль | | #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


    ;Dim Выводной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
        ;Dim strArrayНовый() As String
        ;Dim i, charsInFile, lineCount, curline As Integer 'Short
        ;Dim ln, letter As String
        ;Dim Список As New ArrayList
        ;Dim Дочь As String
        ;Dim КорткийСписок 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Новый) ' Сортировка массива
        ;Dim НовоеИмя 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)
        ;Dim Элемент As String
        ;Dim i As Integer
        ;Dim НовоеИмя, Имя As String
        ;Dim ОкончательныйСписок 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-сайт: iSkywalker.ru
 Профиль | | #15
Добавлено: 03.02.08 17:50
да уже вроде все работает нормально. всем спасибо

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам