多个数组列表按顺序显示重复的subjectname
本文关键字:subjectname 显示 顺序 数组 列表 | 更新日期: 2023-09-27 18:26:19
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
我认为这会生成您想要的输出
首先让我们检查受试者是否需要"_#"结束
现在我们浏览主题,并添加_#结尾每个有不止一次发生的人。该顺序将与输入相同,因为我们会遍历它。计数将在运行中生成,因此这将是正确的。
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
您的问题在于使用字典。字典是不排序的,所以每次迭代时都不能保证顺序。但是List(Of KeyValuePair(Of String,Integer))
可以完成你想要的工作。
此外,您还可以使用相同的列表(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}
你可以从中看出为什么很多人更喜欢List而不是ArrayList。
查看Charles Bretana 的这篇文章
创建这样的类,
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");
我只是按照你的要求修改了,但我对此不确定。