使用Java

时间:2016-05-12 13:44:38

标签: java

我有一个基本的问题,这实际上让我发疯。 我有一个方法,它获取一些对象的列表作为参数。每个对象都有一对整数(分别用于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");
    }

请给我一个如何对抗这个的线索。 感谢。

3 个答案:

答案 0 :(得分:0)

您不应该在最里面的循环中为每个标记打印一个字符;相反,使用该循环来确定在当前(h,w)位置打印哪个字符,然后在标记循环之后打印相应的字符。

答案 1 :(得分:0)

很明显,为什么会发生这种情况:对于每个坐标,您为每个标记打印一个字符。这可以通过摆脱hw上的循环来解决。

例如可以这样做:

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:填写功能的误用,纠正它。