我知道之前已经多次询问过,但我找不到具体的我想要的东西。
我目前正在尝试编写c#方法,在控制台上将int数组显示为垂直条。我的想法是将1D阵列转换为2D。
如果input = {2, 1, 3}
;输出应如下所示:
{{0, 0, 1},
{1, 0, 1},
{1, 1, 1}}
然后我可以用我选择的字符替换1和0来在控制台上显示图像。 到目前为止,我的方法看起来像这样:
public static void DrawGraph()
{
int[] randomArray = new int[3]{ 2, 1, 3 };
int[,] graphMap = new int[3, 3];
for(int i = 0; i < graphMap.GetLength(0); i++)
{
for(int j = 0; j < graphMap.GetLength(1); j++)
{
graphMap[i, j] = randomArray[j];
Console.Write(graphMap[i, j]);
}
Console.WriteLine();
}
}
它产生输出:
2 1 3
2 1 3
2 1 3
答案 0 :(得分:5)
如果2D阵列仅作为帮助您打印的工具,则可以将其完全取出。
private static readonly char GraphBackgroundChar = '0';
private static readonly char GraphBarChar = '1';
void Main()
{
int[] input = {4, 1, 6, 2};
int graphHeight = input.Max(); // using System.Linq;
for (int currentHeight = graphHeight - 1; currentHeight >= 0; currentHeight--)
{
OutputLayer(input, currentHeight);
}
}
private static void OutputLayer(int[] input, int currentLevel)
{
foreach (int value in input)
{
// We're currently printing the vertical level `currentLevel`.
// Is this value's bar high enough to be shown on this height?
char c = currentLevel >= value
? GraphBackgroundChar
: GraphBarChar;
Console.Write(c);
}
Console.WriteLine();
}
这基本上做的是从输入中找到“最高条”,然后从上到下遍历每个垂直级别,每次GraphBarChar
中的图形条都可见时打印input
在当前的高度。
一些样本:
input = {2,1,3};
001
101
111
input = {2,4,1,0,3};
01000
01001
11001
11101
如果您的目标平台支持终端模拟器中的框绘制字符,您可以使用以下字符表示一些非常有说服力的条形图:
private static readonly char GraphBackgroundChar = '░';
private static readonly char GraphBarChar = '█';
input = {2,1,3};
░░█
█░█
███
input = {2,4,1,0,3};
░█░░░
░█░░█
██░░█
███░█
答案 1 :(得分:0)
这是一个比已经给出的更好的功能,
static void DrawGraph(int[] array)
{
int maxElementValue = 0;
foreach (int i in array)
{
if (i > maxElementValue) maxElementValue = i;
}
for (int rowIndex= 0; rowIndex < maxElementValue; ++rowIndex)
{
foreach (int i in array)
{
Console.Write((i < rowIndex - columnIndex ? 0 : 1) + " ");
}
Console.WriteLine();
}
}
它按预期工作。