【问题标题】:How do I print certain parts of my 2D array in a certain order?如何按特定顺序打印 2D 阵列的某些部分?
【发布时间】:2015-11-25 12:32:51
【问题描述】:

我的函数需要接受两个参数,称为数据,播放器。参数数据是一个包含nba.txt 电子表格数据的二维字符串数组。参数 player 是一个字符串。 该函数查找数据中的所有行,其中第 0 列(在其小写版本中)包含作为子字符串存储在播放器中的字符串(也在其小写版本中)。对于所有这样的行,它会打印相应玩家的统计数据。

我的代码:

 public static void print_player_info(String[][] data, String player)
  {
   String name = player.toLowerCase();
   for(int i = 0; i<data[0].length; i++)
   {
    String namecolumn = data[i][0];
    String rownames = data[0][i];
    for(int j = 0; j<data[0].length; j++)
    {
        String temp = Arrays.toString(data[j]);
        if(temp.toLowerCase().contains(player))
        {
            System.out.println(rownames+": "+data[j][i]);
        }
    }
   }  
  }

如果我的输入一次只检索一个人,它会以所需的方式工作。

示例:输入:“lebro” 输出:

player: LeBron James
games played: 69
minutes per game: 36.1
etc...

如果我的输入碰巧检索到多个人,它会堆叠打印:输入“jam”

player: James Harden
player: LeBron James
games played: 81
games played: 69
etc...

当我输入“jor”时,它应该会找到多个包含“jor”的名称,但它什么也不输出。我想知道如何解决这个问题以及之前的输入是:

player: James Harden
games played: 81
etc...
player: LeBron James
games played: 69
etc...

【问题讨论】:

  • 你的数组是这样填充的:[["James Harden", "81"], ["Lebron James", "69"]]?因为这就是二维数组的工作方式。您显示的第二个输出看起来确实不同
  • 2 行的一部分:詹姆斯哈登,81 岁,36.8 岁...勒布朗詹姆斯,69 岁,36.1 岁...
  • 也许您可以使用初始化数组的样本扩展您的示例,并将其作为 String[][] data 传递给您的方法。

标签: java arrays if-statement for-loop printing


【解决方案1】:
public static void print_player_info(String[][] data, String player){
    // lower case the search string
    String searchString = player.toLowerCase();
    // check every row in the data table except the first
    // because it has the column names in it.
    for(int row = 1; row < data.length; row++){
        // get the player name in this row
        String playerInThisRow = data[row][0];
        // lower case it and check if it contains the search string
        if(playerInThisRow.toLowerCase().contains(searchString)){
            // go throu every column in this row
            for(int column = 0; column < data[0].length; column++){
                // and get the column name and the content
                String columnContent = data[row][column];
                String columnName = data[0][column];        
                // and print it
                System.out.println(columnName +": " + columnContent);
            }  
        }
    }
 }

【讨论】:

    【解决方案2】:

    如果您的数组总是以完全相同的方式填充。像这样

    [["James Harden", "81", ...],["Lebron James", "69"]]
    

    那么你总是知道array[x][0]是玩家的名字。 如果您的数组内容看起来与此不同,则您使用的二维数组是错误的。

    知道您可以检查该玩家是否是您所寻找的,然后打印他的统计数据。

    public static void print_player_info(String[][] data, String player)
    {
        String name = player.toLowerCase();
        for(int i = 0; i<data[0].length; i++)
        {
            String namecolumn = data[i][0];
            String rownames = data[0][i];
            if(data[i][0].contains(player)){
                for(int j = 0; j<data[0].length; j++)
                {
                 System.out.println(rownames+": "+data[j][i]);  
                }
            }
        }  
    }
    

    如果不确定玩家的名字将在什么位置,那么最好先循环遍历数组来搜索名字,而不是把它们粘在一起。把它粘在一起会变得不可靠,因为可能其他数据也包含播放器字符串。

    如果您想让自己更轻松,也可以查看字典。有了这个,你就有了一个带有键和值的对象。拥有这些字典的列表和作为值的列表,您可以轻松搜索所需的玩家,前提是他们的名字是唯一的。

    【讨论】:

    • 这停止了任何打印。
    • nba.txt 使用public static String[][] read_spreadsheet(String filename) { ArrayList&lt;String&gt; lines = read_file(filename); int rows = lines.size(); String[][] result = new String[rows][]; for (int i = 0; i &lt; lines.size(); i++) { String line = lines.get(i); String [] values = line.split(","); result[i] = values; } return result; } 转换成二维数组
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多