从2d数组中删除java中的列

时间:2017-04-15 09:17:06

标签: java arrays multidimensional-array

我正在尝试编写一个java方法,该方法将采用2d数组并将内容添加到指定行的新2d数组中。所以如果我有2d数组

1234
1234
1234

我想删除第3列,我想要

124
124
124

问题是我无法弄清楚如何让它发挥作用。我能想到的最好的方法是以下方法。

private static int[][] removeCol(int [][] array, int colRemove)
{
    int row = array.length;
    int col = array[0].length;

    int [][] newArray = new int[row][col];

    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < col; j++)
        {
            if(j != colRemove)
            {
                newArray[i][j] = array[i][j];
            }
        }
    }

    return newEx;
}

现在这个方法将返回此

1204
1204
1204

但如果我能得到我想要的结果,它会更好。有没有办法做到这一点,还是我坚持目前的结果?

6 个答案:

答案 0 :(得分:1)

您可以使用一个变量currColumn来表示当前列的位置,结果数组的列数将少于原始列。所以根据这个你可以改变你的代码。

private static int[][] removeCol(int [][] array, int colRemove)
{
    int row = array.length;
    int col = array[0].length;

    int [][] newArray = new int[row][col-1]; //new Array will have one column less


    for(int i = 0; i < row; i++)
    {
        for(int j = 0,currColumn=0; j < col; j++)
        {
            if(j != colRemove)
            {
                newArray[i][currColumn++] = array[i][j];
            }
        }
    }

    return newEx;
}

另一种更好的方法是使用像ArrayList这样的动态结构。所以在这里你需要有Array of ArrayList然后你可以用remove()方法删除元素。如果您想更新任何元素,则可以使用set()方法。

答案 1 :(得分:0)

只需使用另一个在循环运行时不会自动递增的索引:

    //on the home page to display users posts 
    <h4>RECENT ACTIVITY</h4>
    <div class="panel panel-default">
    <div class="panel-body">


   <?php
   $users = show_users($_SESSION['login']);
   if (count($users)){
   $myusers = array_keys($users);
   }else{
   $myusers = array();
   }
   $myusers[] = $_SESSION['login'];
   $posts = show_posts($myusers,5);

   if (count($posts)){

   foreach ($posts as $key => $list){
   echo $list['post_date'] ;
   echo $list['user_id'];
   echo $list['post_body'] ;

   }

   }else{
   echo"<p>","<b>","You haven't posted anything yet!","</b>","</p>";
   }
   ?>
   </div>
   </div>

   //the function
   <?php
   function show_posts($user_id,$limit=0){
   global $conn,$user_id;
   $posts = array();
   $user_string = implode(',', $user_id);
   $extra =  " and user_id in ($user_string)";
   if ($limit > 0){
   $extra = "limit $limit";
   }else{
   $extra = '';
   }
   $sql = "select user_id,post_body, post_date from users_posts
   where user_id in ($user_string)
   order by post_date desc $extra";
   echo $sql;
   $result = mysqli_query($conn,$sql);
   while($data = mysqli_fetch_object($result)){
   $posts[] = array(  'post_date' => $data->post_date,
   'user_id' => $data->user_id,
   'post_body' => $data->post_body
   );
   }
   return $posts;
   }
   ?>

答案 2 :(得分:0)

将逻辑与基于0的列号保持一致:

    private static int[][] removeCol(int[][] array, int colRemove) {
    int row = array.length;
    int col = array[0].length;

    int[][] newArray = new int[row][col - 1]; // You will have one column less

    for (int i = 0; i < row; i++) {
      for (int j = 0; j < col; j++) {
        if (j != colRemove) {
          newArray[i][j > colRemove ? j -1 : j] = array[i][j]; // If you're looking at an index greater than the one to remove, you have to reduce index by one
        }
      }
    }

    return newArray;
  }

答案 3 :(得分:0)

在第二次迭代中检查colRemove值并移动+1以进行其他迭代。请参阅以下代码

private static int[][] removeCol(int [][] array, int colRemove)
{
    int row = array.length;
    int col = array[0].length-1;

    int [][] newArray = new int[row][col];

    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < col; j++)
        {
            if(j>=colRemove){
                 newArray[i][j] = array[i][j+1];
            }
            else{
                newArray[i][j] = array[i][j];
            }
        }
    }

    return newArray;
}

答案 4 :(得分:0)

实际上,您要使用默认值int替换要删除的元素,即:0

如果不是要删除的元素,请复制元素:

if(j != colRemove)
{
     newArray[i][j] = array[i][j];
}

否则您什么也不做(因此它取自0的默认int值。)

您应该从1减少新创建数组的第二维。

你可以这样:

  • 使用全局循环迭代行(数组的第一维)

  • 使用两个连续的内部循环来迭代列(数组的第二个维度)。
    第一个迭代直到&#34;要删除的列 - 1&#34;并在新数组中制作元素的简单副本 第二个从&#34;列开始删除&#34;并转移到新数组中原始数组的每个元素。

这是一个有效的代码:

import java.util.Arrays;

public class Array2D {

    public static void main(String[] args) {

        int[][] arrayOriginal = new int[][]{{1,2,3,4},{1,2,3,4},{1,2,3,4}};
        int[][] arrayNew = removeCol(arrayOriginal, 2);
        System.out.println(Arrays.deepToString(arrayNew));;
    }
    private static int[][] removeCol(int [][] array, int colRemove)
    {
        int row = array.length;
        int col = array[0].length;

        int [][] newArray = new int[row][col-1];

        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < colRemove; j++)
            {              
                newArray[i][j] = array[i][j];                
            }

            for(int j = colRemove; j < col-1; j++)
            {                          
               newArray[i][j] = array[i][j+1];
            }

        }

        return newArray;
    }
}

输出结果为:

[[1, 2, 4], [1, 2, 4], [1, 2, 4]]

答案 5 :(得分:-1)

public static String[][] dropColumnFromTable(String[][] table, int colNumber) {
    int rows = table.length;
    int col = table[0].length - 1;
    String[][] result = new String[rows][col];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < col+1; j++) {
            if (j < colNumber) {
                result[i][j] = table[i][j];
            } else if (j == colNumber) {
                // Do nothing
            } else if (j > colNumber) {
                result[i][j-1] = table[i][j ];
            }
        }
    }
    return result;
}