我有一个基本的问题,这实际上让我发疯。 我有一个方法,它获取一些对象的列表作为参数。每个对象都有一对整数(分别用于x和y坐标)。 目标是:使用为给定坐标列表中的每个对象设置的标记打印2d数组,如下例所示(m-是标记;数组大小为h:2,w:5)。阵列宽度和高度必须保持不变。
m....
...m.
这是我遇到的解决方案之一。它的主要问题是数组宽度乘以参数列表中的对象数量。
假设:Array是一个char数组并已预定义。命名为't'。
public void printArray (ArrayList<Marker> marker) {
for (int h=0;h<t.length;h++) {
for (int w=0;w<t[h].length;w++) {
for (Marker m: marker) {
if (h==m.getY() && w==m.getX()) {
System.out.print('m');
} else {
System.out.print('.');
}
}
}
System.out.print("\n");
}
请给我一个如何对抗这个的线索。 感谢。
答案 0 :(得分:0)
您不应该在最里面的循环中为每个标记打印一个字符;相反,使用该循环来确定在当前(h,w)位置打印哪个字符,然后在标记循环之后打印相应的字符。
答案 1 :(得分:0)
很明显,为什么会发生这种情况:对于每个坐标,您为每个标记打印一个字符。这可以通过摆脱h
和w
上的循环来解决。
例如可以这样做:
public void printArray (ArrayList<Marker> marker) {
// Create an array of chars, and make sure all values are set to '.'
boolean[][] array = new char[t.length][t[h].length];
for (int h=0; h < t.length; h++) {
for (int w=0; w < t[h].length; w++) {
array[h][w] = '.';
}
}
// For each marker, set the value in the array at the marker's position to m
for (Marker m: marker) {
array[m.getY()][m.getX()] = 'm';
}
// Print the array
for (int h=0; h<t.length; h++) {
for (int w=0; w<t[h].length; w++) {
System.out.print(array[h][w]);
}
System.out.println();
}
}
可能这不是最佳解决方案,因为存在大量循环。我不知道java是否有更好的方法来初始化数组值,例如。
答案 2 :(得分:0)
如果我很清楚你想做什么,一个想法是实例化一个布尔数组,表示至少有一个带有单元格坐标的对象。然后你循环抛出布尔数组,并像你一样打印“m”,如果为真,“。”如果不对。
这是一个例子(尽管还没有尝试过)
实例化数组:
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
TmrReporte.Stop()
WriteRTBLog("Finalizacion del programa. - Version " & Me.ProductVersion, Color.Blue)
Dim Fecha As String
Fecha = Now.ToShortDateString & "-" & Now.ToLongTimeString
Fecha = Fecha.Replace("/", "")
Fecha = Fecha.Replace(":", "")
Dim PathArchivo As String = Application.StartupPath & "\Logs\" & Fecha & ".logout"
'If (Not System.IO.Directory.Exists(PathArchivo)) Then
' System.IO.Directory.CreateDirectory(PathArchivo)
'End If
RTB_Log.SaveFile(PathArchivo, System.Windows.Forms.RichTextBoxStreamType.RichText)
End Sub
每当有对象时填充此数组:
boolean[][] boolTab = new boolean[2][5];
for (boolean[] row : boolTab){
Arrays.fill(row,false);
}
打印阵列:
for (Marker m: marker) {
boolTab[m.getY()][m.getX()] = 'm';
}
我保持简单,不考虑阵列的初始尺寸。但是你可以很容易地调整上面的代码。
编辑:Oebele建议的一些改进编辑。编辑2:填写功能的误用,纠正它。