3

C#での回答も助けてくれます。

複数の配列リストに重複した文字列がある場合、以前と同じように更新して順番に表示するために、このコードを試しました。

maths
english
maths
hindi
english
science
Economics
scince

このような出力が必要です

maths_1
english_1
maths_2
hindi
science_1
Economics
scince_2

このコードを試しましたが、出力が順番にありません**

Dim subjectCounts As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)
            For Each subject As String In arraysub
                If subjectCounts.ContainsKey(subject) Then
                    subjectCounts(subject) = (subjectCounts(subject) + 1)
                Else
                    subjectCounts.Add(subject, 1)
                End If
            Next
            Dim output As List(Of String) = New List(Of String)

            For Each pair As KeyValuePair(Of String, Integer) In subjectCounts
                If (pair.Value > 1) Then
                    Dim i As Integer = 1
                    Do While (i <= pair.Value)
                        output.Add((i.ToString + ("_" + pair.Key)))

                        i = (i + 1)
                    Loop
                Else
                    output.Add(pair.Key)
                End If
            Next
4

3 に答える 3

2

あなたの問題は、辞書の使用にあります。辞書は順序付けされていないため、繰り返し処理するたびに順序が保証されません。しかし、List(Of KeyValuePair(Of String,Integer))あなたが望む仕事をします。

さらに、同じ list(Of String) を使用してそれを行うことができます。私は arraylist をあまり使用せず、リストにできない必要性を見つけたことはありませんが、構文はほとんど同じであるべきだと思います。このようなものが動作するはずです

Dim arraysub As List(Of String) = New List(Of String)({
"maths",
"english",
"maths",
"hindi",
"english",
"science",
"Economics",
"science"
})
For i = 0 To arraysub.Count - 1
    If Not Char.IsDigit(arraysub(i).Last) Then
        Dim temp As String = arraysub(i)
        For j = 0 To arraysub.FindAll(Function(s) s = arraysub(i)).Count - 1
            arraysub(arraysub.IndexOf(temp)) += "_" + (j + 1).ToString
        Next
    End If
Next

出力は次のとおりです。

?arraysub
Count = 8
    (0): "maths_1"
    (1): "english_1"
    (2): "maths_2"
    (3): "hindi_1"
    (4): "english_2"
    (5): "science_1"
    (6): "Economics_1"
    (7): "science_2"

配列リストを使用した同じコードを次に示します。

    Dim arraysub As ArrayList = New ArrayList(New String(7) {"maths", "english", "maths", "hindi", "english", "science", "Economics", "science"})
    For i = 0 To arraysub.Count - 1
        If Not Char.IsDigit(CStr(arraysub(i)).Last) Then
            Dim temp As String = CStr(arraysub(i))
            For j = 0 To Array.FindAll(arraysub.ToArray, Function(s) s Is CStr(arraysub(i))).Count - 1
                arraysub(arraysub.IndexOf(temp)) = CStr(CStr(arraysub(arraysub.IndexOf(temp))) & "_" + (j + 1).ToString)
            Next
        End If
    Next

そして、この出力があります:

?arraysub
Count = 8
    (0): "maths_1" {String}
    (1): "english_1" {String}
    (2): "maths_2" {String}
    (3): "hindi_1" {String}
    (4): "english_2" {String}
    (5): "science_1" {String}
    (6): "Economics_1" {String}
    (7): "science_2" {String}

このことから、多くの人が ArrayList よりも List を好む理由がわかります。

于 2013-08-05T06:26:03.577 に答える
2

これにより、必要な出力が生成されると思います

まず、件名の末尾に「_#」が必要かどうかを確認しましょう

次に、件名を調べて、複数回出現するすべての人に _# 末尾を追加します。実行するため、順序は入力と同じになります。カウントはその場で生成されるため、これは正しいでしょう。

    Dim hasMultiple As New Dictionary(Of String, Boolean)
    For Each subject As String In arraysub
        If hasMultiple.ContainsKey(subject) Then
            hasMultiple(subject) =  True
        Else
            hasMultiple.Add(subject, False)
        End If
    Next

    Dim output As New List(Of String)
    Dim subCount As New Dictionary(Of String, Integer) 
    For Each subject As String In arraysub
        If Not subCount.ContainsKey(subject) Then
            subCount.Add(subject, 0)
        End If
        subCount(subject) += 1
        If hasMultiple(subject) Then
            output.Add(subject & "_" & subCount(subject))
        Else
            output.Add(subject)
        End If
    Next
于 2013-08-05T09:11:52.433 に答える
1

チャールズ・ブレタナによるこの投稿をチェックしてください

このようなクラスを作成し、

     public class MultiDimDictList<K, T>: Dictionary<K, List<T>>  
       {
           public void Add(K key, T addObject)
           {
               if(!ContainsKey(key)) 
               {
               Add(key, new List<T>());
               base[key].Add(addObject);
               }else{
               for(int i=1; i<i+1;i++){
                if(!ContainsKey(key+"_"+i)){
                    Add(key+"_"+i+, new List<T>());
                    base[key+"_"+i].Add(addObject+"_"+i);       
                    break;
                  }
                }
              }  
           }           
       }

以下のように呼び出し、

myDicList.Add("YourKEY", "YourSUBJECT");

私はちょうどあなたの要求に従って修正しましたが、私はこれについて確信が持てません.

于 2013-08-05T06:57:11.853 に答える