-
April 11th, 2010, 12:10 PM
#1
an array with char index
Hi guys,
I need some help to create an array with character indexing like this:
A B C D E ....
A 0 0 0 0 0
B 0 0 0 0 0
C 0 0 0 0 0
D 0 0 0 0 0
E 0 0 0 0 0
.
.
so that I can record the occurrence of a particular pair of letters. I tried to search on msdn but found no clue yet.
my guess is that I can use an alphabet enum to assign index to each letter. But the problem is that I cant use alphabet letter as textual data (ie string, char)
Can anybody give me a hint?
-
April 11th, 2010, 02:21 PM
#2
Re: an array with char index
Hi there.
You could a two dimensional array of integers. You don't have to index with a 'char'. You can map each index to a character. For example 0 -> 'A' and so on. If you want you can define an enumeration for the alphabet. There is already System.Windows.Forms.Keys enumeration but the values there map to ASCII so you couldn't use them to index into the array. Though you could always subtrat 65 from each value...
-
April 11th, 2010, 04:08 PM
#3
Re: an array with char index
Don't use arrays, use an associative collection:
Code:
Dictionary<char,int> tally = new Dictionary<char,int>();
foreach( char c in someString.ToCharArray( ) )
{
if( !tally.ContainsKey( c ) )
{
tally.Add( c, 0 );
}
tally[ c ]++;
}
-
April 12th, 2010, 07:08 PM
#4
Re: an array with char index
Had time to experiment. Created a CharMatrix class that should do what you want:
Code:
public class CharMatrix
{
// row, column, value
private Dictionary<Char, Dictionary<Char, Int32>> _matrix;
public CharMatrix()
{
// empty rows with no columns, results in Get(...) returning values of zero
_matrix = new Dictionary<Char, Dictionary<Char, Int32>>();
}
/// <summary>
/// Get a value from the Matrix
/// </summary>
/// <param name="row">The row index</param>
/// <param name="column">The column index</param>
/// <returns>The value</returns>
public Int32 Get(Char row, Char column)
{
Dictionary<Char, Int32> rowVector;
// see if row is present
if (_matrix.TryGetValue(row, out rowVector))
{
// return value from column if present
Int32 matrixValue;
if (rowVector.TryGetValue(column, out matrixValue))
return matrixValue;
}
// no column and/or no row, so return 0
return 0;
}
/// <summary>
/// Set a value in the matrix
/// </summary>
/// </summary>
/// <param name="row">The row index</param>
/// <param name="column">The column index</param>
/// <param name="value">The value</param>
public void Set(Char row, Char column, Int32 value)
{
Dictionary<Char, Int32> rowVector;
// see if row is present
if (_matrix.TryGetValue(row, out rowVector))
{
// update the value if it exists else add a new value
if (rowVector.ContainsKey(column))
rowVector[column] = value;
else
rowVector.Add(column, value);
}
else
{
// row was not present so create it, with the column value
Dictionary<Char,Int32> newRow = new Dictionary<Char,Int32>();
newRow.Add(column, value);
// add it to the matrix
_matrix.Add(row, newRow);
}
}
/// <summary>
/// Increment a value in the matrix
/// </summary>
/// <param name="row">The row index</param>
/// <param name="column">the column index</param>
public void Increment(Char row, Char column)
{
// neatest way, not the best performance
Set(row, column, Get(row, column) + 1); // easy to do Add, Subtract, Multiply etc
}
}
Tested with...
Code:
CharMatrix matrix = new CharMatrix();
Int32 w = matrix.Get('R', 'K'); // w = 0
matrix.Set('A', 'B', 10);
Int32 x = matrix.Get('A', 'B'); // x = 10
matrix.Increment('A', 'B');
Int32 y = matrix.Get('A', 'B'); // y = 11
matrix.Increment('A', 'D');
Int32 z = matrix.Get('A', 'D'); // z = 1
Rob
-
Ohhhhh.... Old McDonald was dyslexic, E O I O EEEEEEEEEE.......
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|