הערה
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות להיכנס או לשנות מדריכי כתובות.
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות לשנות מדריכי כתובות.
Question
Sunday, December 7, 2008 1:31 AM
i want to count the number of occurences of an element that are there in a 2d array. below is my code
Dim numbers(,) As Integer = {{1, 2}, _
{4, 5}, _
{7, 9}, _
{3, 1}, _
{2, 3}, _
{5, 9}, _
{8, 8}, _
{9, 9}, _
{7, 3}, _
{2, 1}, _
{5, 4}}
Dim arrC(9) As Integer '= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Dim rows As Integer
Dim columns As Integer
Dim i, counter, totalrows As Integer
'totalrows = ((numbers.Length / 2) - 1)
For i = 0 To 10
For j = 0 To 1
If arrC(numbers(i, j)) Then
MessageBox.Show(arrC(numbers(i, j)).ToString)
arrC(numbers(i, j)) += 1
Else
arrC(numbers(i, j)) = 1
End If
Next
Next
For Each a_arrc In arrC
MessageBox.Show(a_arrc.ToString)
Next
can someone please help me try to fix the problem ?
All replies (10)
Sunday, December 7, 2008 3:13 AM ✅Answered | 1 vote
Hi GJ111,
Welcome to the forums. :-)
Try a FOR EACH loop like this.
Try this code with one button on a FORM please.
Please note you said; "an element" not that you want to count every element occurrence.
Result = **There are 3 number 5's
**
Regards,
John
Option Strict On |
Public Class Form1 |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click |
Dim numbers(,) As Integer = _ |
{{1, 2}, {4, 5}, {7, 9}, {3, 1}, {2, 3}, {5, 9}, _ |
{8, 8}, {9, 9}, {7, 3}, {2, 1}, {5, 4}} |
'To count the number of number 5's in the array called "numbers" |
Dim count As Integer = 0 |
For Each num As Integer In numbers |
If num = 5 Then count = count + 1 |
Next |
MessageBox.Show("There are " & count.ToString & " number 5's") |
End Sub |
End Class |
For links to VB.Net tutorials see here.>> http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/29f2179b-997b-4115-a96d-a0834853b835
Sunday, December 7, 2008 3:28 AM ✅Answered | 1 vote
Hi again,
If you want to count each and every number then do this.
Add one button to a FORM to try this please.
Regards,
John
Option Strict On |
Public Class Form1 |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click |
Dim numbers(,) As Integer = _ |
{{1, 2}, {4, 5}, {7, 9}, {3, 1}, {2, 3}, {5, 9}, _ |
{8, 8}, {9, 9}, {7, 3}, {2, 1}, {5, 4}} |
Dim counts(9) As Integer |
For Each num As Integer In numbers |
Select Case num |
Case 0 |
counts(0) += 1 |
Case 1 |
counts(1) += 1 |
Case 2 |
counts(2) += 1 |
Case 3 |
counts(3) += 1 |
Case 4 |
counts(4) += 1 |
Case 5 |
counts(5) += 1 |
Case 6 |
counts(6) += 1 |
Case 7 |
counts(7) += 1 |
Case 8 |
counts(8) += 1 |
Case 9 |
counts(9) += 1 |
End Select |
Next |
Dim sb As New System.Text.StringBuilder |
For index As Integer = 0 To 9 |
sb.Append("There are " & counts(index).ToString & " number " & index.ToString & "'s found." & ControlChars.NewLine) |
Next |
MessageBox.Show(sb.ToString) |
End Sub |
End Class |
For links to VB.Net tutorials see here.>> http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/29f2179b-997b-4115-a96d-a0834853b835
Monday, December 8, 2008 9:39 AM ✅Answered | 1 vote
Hi,
John's answer is quite good for the question. And I just do a little modification in the following way:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim numbers(,) As Integer = _
{{1, 2}, {4, 5}, {7, 9}, {3, 1}, {2, 3}, {5, 9}, _
{8, 8}, {9, 9}, {7, 3}, {2, 1}, {5, 4}}
Dim counts(9) As Integer
For Each num As Integer In numbers
If num >= 0 And num < 10 Then
counts(num) += 1
End If
Next
Dim sb As New System.Text.StringBuilder
For index As Integer = 0 To 9
sb.Append(index.ToString & ": " & counts(index).ToString & ControlChars.NewLine)
Next
MessageBox.Show(sb.ToString)
End Sub
End Class
Monday, December 8, 2008 11:58 AM ✅Answered | 1 vote
this will work with any integers in numbers. if the range of numbers is large another approach would be better.
Dim numbers(,) As Integer = {{1, 2}, _ |
{4, 5}, _ |
{7, 9}, _ |
{3, 1}, _ |
{2, 3}, _ |
{5, 9}, _ |
{8, 8}, _ |
{9, 9}, _ |
{7, 3}, _ |
{2, 1}, _ |
{13, 20}, _ |
{19, 21}, _ |
{5, 4}} |
Dim arrC As New List(Of Integer) |
Dim nRow As Integer, nCol As Integer |
For nRow = 0 To numbers.GetUpperBound(0) |
For nCol = 0 To numbers.Rank - 1 |
If numbers(nRow, nCol) >= arrC.Count Then |
Do While numbers(nRow, nCol) >= arrC.Count |
arrC.Add(0) |
Loop |
End If |
arrC(numbers(nRow, nCol)) += 1 |
Next |
Next |
Dim sb As New System.Text.StringBuilder |
For i As Integer = 0 To arrC.Count - 1 |
sb.Append(i.ToString.PadRight(8, " "c)) |
sb.Append(arrC(i).ToString) |
sb.Append(Environment.NewLine) |
Next |
MessageBox.Show(sb.ToString) |
Stop |
Tuesday, December 9, 2008 8:35 PM ✅Answered | 1 vote
If you're using VB2008, then LINQ and Llamda functions come in very handy:
Public Class Program |
Public Shared Sub Main() |
Dim vehicles() As Vehicle = { _ |
New Vehicle("Car", "Red", "Ferrari"), _ |
New Vehicle("Truck", "Green", "Ford"), _ |
New Vehicle("Truck", "White", "Chevy"), _ |
New Vehicle("Car", "Blue", "Aston Martin"), _ |
New Vehicle("Car", "Red", "Porsche"), _ |
New Vehicle("Truck", "Brown", "Toyota"), _ |
New Vehicle("Car", "Orange", "Honda"), _ |
New Vehicle("Car", "Blue", "Toyota"), _ |
New Vehicle("Truck", "Orange", "Dodge") _ |
} |
'using Llambda functions |
Dim redFerraris = vehicles.Where(Function(v) v.Make = "Ferrari" AndAlso v.Color = "Red") |
Dim blueCars = vehicles.Where(Function(v) v.Type = "Car" AndAlso v.Color = "Blue") |
'using LINQ Dim trucks = From v In vehicles _ Where v.Type = "Truck" _ Select v Dim linqRedFerraris = From v1 In vehicles _ Where v1.Make = "Ferrari" AndAlso v1.Color = "Red" _ Select v1 |
Console.ReadLine() |
End Sub |
End Class |
Public Class Vehicle |
Public Type As String |
Public Color As String |
Public Make As String |
Public Sub New() |
End Sub |
Public Sub New(ByVal t As String, ByVal c As String, ByVal m As String) |
Type = t |
Color = c |
Make = m |
End Sub |
End Class |
I used a simple class for Vehicle with nothing but public string fields for the example, to keep it short.
This same sort of thing can be accomplished in VB2005 by using the Array.FindAll method in conjunction with a delegate.
Chris
Tuesday, December 9, 2008 1:14 PM | 1 vote
Hi ALL,
I thought I would add an updated version. :-) ;-)
By the way thanks typot for your idea. :-)
This version does not show any value where the count is zero.
I thought what is the point in showing a zero count?
It will also only work for INTEGER values greater than or equal to zero so the array is declared as
UInteger which means an Unsigned Integer.
Again this code has a limited range depending on what the highest number in the array of numbers is.
Regards,
John
Option Strict On |
Public Class Form1 |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click |
Dim numbers(,) As UInteger = _ |
{{1, 2}, {4, 5}, {765, 9}, {3, 1}, {2, 3}, {5, 9}, _ |
{8, 8}, {9, 9}, {765, 3}, {2, 1}, {5, 1000}} |
Dim numbersList As New List(Of UInteger) |
For Each num As UInteger In numbers |
numbersList.Add(num) |
Next |
Try |
Dim newArray() As UInteger = numbersList.ToArray |
Array.Sort(newArray) |
Dim counts(CInt(newArray(newArray.GetUpperBound(0)))) As Integer |
For Each num As UInteger In newArray |
If num >= 0 And num <= newArray(newArray.GetUpperBound(0)) Then |
counts(CInt(num)) += 1 |
End If |
Next |
Dim sb As New System.Text.StringBuilder |
For index As Integer = CInt(newArray(newArray.GetLowerBound(0))) To CInt(newArray(newArray.GetUpperBound(0))) |
If counts(index) <> 0 Then |
sb.Append(index.ToString & ": " & counts(index).ToString & ControlChars.NewLine) |
End If |
Next |
MessageBox.Show(sb.ToString) |
Catch ex As Exception |
MessageBox.Show(ex.ToString) |
End Try |
End Sub |
End Class |
For links to VB.Net tutorials see here.>> http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/29f2179b-997b-4115-a96d-a0834853b835
Tuesday, December 9, 2008 1:35 PM | 1 vote
Hi ALL,
Here is an INTEGER version of the above code but a rethink would be need as the -999 is not detected.
This is because negative array indexes are not allowed in Vb.Net.
Regards,
John
Option Strict On |
Public Class Form1 |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click |
Dim numbers(,) As Integer = _ |
{{1, 2}, {4, 5}, {765, -999}, {3, 1}, {2, 3}, {5, 9}, _ |
{8, 8}, {9, 9}, {765, 3}, {2, 1}, {5, 1000}} |
Dim numbersList As New List(Of Integer) |
For Each num As Integer In numbers |
numbersList.Add(num) |
Next |
Try |
Dim newArray() As Integer = numbersList.ToArray |
Array.Sort(newArray) |
Dim counts(CInt(newArray(newArray.GetUpperBound(0)))) As Integer |
For Each num As Integer In newArray |
If num >= 0 And num <= newArray(newArray.GetUpperBound(0)) Then |
counts(CInt(num)) += 1 |
End If |
Next |
Dim sb As New System.Text.StringBuilder |
For index As Integer = 0 To CInt(newArray(newArray.GetUpperBound(0))) |
If counts(index) <> 0 Then |
sb.Append(index.ToString & ": " & counts(index).ToString & ControlChars.NewLine) |
End If |
Next |
MessageBox.Show(sb.ToString) |
Catch ex As Exception |
MessageBox.Show(ex.ToString) |
End Try |
End Sub |
End Class |
For links to VB.Net tutorials see here.>> http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/29f2179b-997b-4115-a96d-a0834853b835
Tuesday, December 9, 2008 2:24 PM
Hi ALL,
So what I mention above leads me to another interesting problem.
How would you count the occurrence of each of the various OBJECTs in an array as well count the occurrence of each of the numbers even if they are positive or negative?
1) Say we count the occurrence of each of the numbers that are zero and above, now we want to count the occurrence of each of the numbers below zero as well as count the occurrence of each of the other objects that are identical. How could we do that?
Say we have 2 Red Ferrari cars and lots of other cars, how could we count the objects of TYPE = CAR or say count the number of RED cars or say count the number of Ferrari cars.
Now you might be thinking this is erring on databases and SQL queries and you would be right.
2) For a second but similar problem, I am thinking of 1 general routine to count each number whether positive or negative as well as simply count the objects of a particular TYPE, such as count the STRINGs, and count each occurence of each number too.
I guess both problems would possibly be solved in
conjuction with a COMPARER and a DICTIONARY maybe?
Regards,
John
For links to VB.Net tutorials see here.>> http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/29f2179b-997b-4115-a96d-a0834853b835
Tuesday, December 9, 2008 9:43 PM
findall only works for one dimensional arrays.
Wednesday, December 10, 2008 3:24 AM
Chris Dunaway said:
If you're using VB2008, then LINQ and Llamda functions come in very handy:
I used a simple class for Vehicle with nothing but public string fields for the example, to keep it short.
This same sort of thing can be accomplished in VB2005 by using the Array.FindAll method in conjunction with a delegate.
Chris
Hi Chris,
Thanks for your code, your post, your time etcetera.
LINQ and Llamda functions are some of the other things I need to look into and learn.
I have already done SQL at university recently on my current course so I can see the SQL style statements in your code.
Thanks again. :-)
Regards,
John
For links to VB.Net tutorials see here.>> http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/29f2179b-997b-4115-a96d-a0834853b835