如何从二维数组中获取第一列的内容

Posted

技术标签:

【中文标题】如何从二维数组中获取第一列的内容【英文标题】:How to get the first column's contents from a 2D array 【发布时间】:2013-01-24 22:57:31 【问题描述】:

如何从二维数组中提取第一列?我正在用这样的方法初始化我的数组

//Initialise the array with the values from the file
public static float[][] data(float[][] data, Scanner scan)
    int count = 0; 

    for (int i=0;i<data.length;i++)
        for (int j=0;j<data[0].length;j++)
            count++;    
            if(count<data.length*data[0].length)
                for(int k=0;k<2; k++)

                    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                    System.out.print(data[i][j] + "  ");    
                

            System.out.println();
               
        

    
    return data;    


这是我的测试文件的内容。 (请记住文件可以是任意长度)

13.97  2.2  
12.05  1.9  
9.99  1.5  
8.0  1.3  
6.0  0.9  
4.0  0.6  
2.0  0.3  
0.0  0.0  
-2.0  -0.3  
-4.0  -0.6  
-6.02  -0.9  
-8.0  -1.3  
-9.99  -1.6  
-12.03  -1.9  
-13.98  -2.2

在终端上,但问题是当我尝试调用左列时,我得到的是右列。我不确定这是否是因为右侧的值是唯一被存储的值。

      //should print x but actually prints y 
   public static void printX(float[][] data)

        for (int i=0;i<data.length;i++)
            for (int j=0;j<data[0].length;j++)

                System.out.println(data[i][j]);
            
        
    

哪个输出

2.2
1.9
1.5
1.3
0.9
0.6
0.3
0.0
-0.3
-0.6
-0.9
-1.3
-1.6
-1.9
-2.2
0.0

谁能澄清我如何才能最好地从二维数组中获取左侧列上的数据?或者如果有其他方法可以实现这种事情?

【问题讨论】:

你能显示第二个函数的输出吗? 好的,我早就该这么做了! 问题出在您的数组初始化函数中,即它没有将值放在您认为的位置。你在做什么:for(int k=0;k&lt;2; k++) 循环 100% 不是你想要的。尝试重写这个函数。 我所有的帖子都是英语。如果我搬到别处,我会重新考虑编辑。在此之前,请坚持格式和语法结构等(除非您 100% 认为拼写错误而不是外文)。 ;-) 【参考方案1】:

您需要在您的 IDE 上使用调试器并单步执行您的代码以查看到底发生了什么。对我的简短回答看起来像你在 k=0 和 k=1 的情况下两次读取数据来破坏同一个字段。

编辑

在您的更新中,我认为您正在第二个打印循环中寻找这个(这并不重要,可能很容易成为 2,但这是更好的 IMO):

for (int j=0;j<data[i].length;j++)

编辑这是我认为你想要明确的代码:

//Only print X
public static void printX(float[][] data)

    for (int i=0;i<data.length;i++)
       System.out.println(data[i][0]);
    


//Only print Y
public static void printY(float[][] data)
    for (int i=0;i<data.length;i++)
       System.out.println(data[i][1]);
    


//Print both
public static void printBoth(float[][] data)
    for (int i=0;i<data.length;i++)
       System.out.println(data[i][0] + ", " + data[i][1]);
    



//Print any number in array:
public static void printAll(float[][] data)
    for (int i=0;i<data.length;i++)
        for (int j=0;j<data[i].length;j++)
            System.out.print(data[i][j];
            if (j+1 < data[i].length) 
                System.out.print(", ");
             else 
                System.out.println();
            
        
    

最后,您的数组初始化不正确,这就是您遇到这么多麻烦的原因:您实际上是将两个值都写入 X 组件,所以第一次循环 k 时,您将 X 值写入 i,j (例如data[0][0])并打印出来。第二次循环 k 时,您将 Y 值再次写入相同的 i,j(例如data[0][0])并打印出来。这看起来像您正在打印您想要的数组,但实际上您正在将两个值写入同一列。你真的想要没有 k 循环的东西:

//Initialise the array with the values from the file
public static float[][] data(float[][] data, Scanner scan)
    int count = 0; 

    for (int i=0;i<data.length;i++)
        for (int j=0;j<data[0].length;j++)
            count++;    
            if(count<data.length*data[0].length)
                data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                System.out.print(data[i][j] + "  ");
                
        
        System.out.println();
    
    return data;    

如果您想强制执行我认为 k 正在执行的 2 列,例如:

public static float[][] data(float[][] data, Scanner scan)
    for (int i=0;i<data.length;i++)
        for (int j=0;j<2;j++)
            data[i][j] = (float)   IOUtil.skipToDouble(scan); 
            System.out.print(data[i][j] + "  ");
        
        System.out.println();
    
    return data;    

count 也是不必要的,因为它只是控制它已经处理/限制的数组总大小的另一种方式,它通过循环每一列(或者在你知道它是两个宽的第二个示例中)由data.length / data[0].length

由 OP 添加的编辑:

为那些仍然不明白的人澄清一下,他们可能对我曾经遇到的同一件事感到困惑:我误解了值的存储位置,所以这就是为什么我将问题设置错误并且没有一个简短的答案任何意义。

我认为整个事情有点过于字面意思了,假设 value[here][] 保存了第一列中的值,而 value[][here] 保存了第二列中的值。

我不确定我为什么坚持这一点,但我认为这与我使用一维数组的方式有关(无需告诉他们有一个列)。

【讨论】:

对不起,我没有关注。我在 intellij 上进行了分析,但没有什么明显的。 哦,我想我现在明白你的意思了。你的意思是我用第二列写在第一列? 是的 - 您在不更改 i 或 j 的情况下写入 data[i][j] 两次,因为您在 k 中循环两次创建打印输出。 我对您如何命名这些方法感到有些困惑。是否有将他们称为调用 printX 的动机,还是复制粘贴错误? 我得到了它的工作,我现在完全明白了,我对 2D 阵列的恐惧已经得到治愈。谢谢,但是话虽如此,我想确保在赏金活动期间有一个真正完整的答案,因为我认为这可能会帮助其他在二维数组概念上苦苦挣扎的人(它会是在我拿回 50 美元之前的几年;))。尽管所有答案都对您有所帮助,但最重要的是您的答案。他们似乎没有一个人真正认识到我对二维数组的工作方式(在 java 中,可能还有其他语言,如 c++ 中)的理解失败;【参考方案2】:

不明白你的代码,但我希望这会有所帮助:

float[][] data = new float[10][2];
// ... fill the array with data
// print 'left' column:
for (int i = 0; i < data.length; i++) 
    System.out.println(data[i][0]);

【讨论】:

我怀疑我们都在战略上因为赏金而被否决了。 不是我。尽管记录在案,但该答案对我的问题不起作用。我现在要检查其他的。【参考方案3】:

你想用这部分代码做什么?

for(int k=0;k<2; k++)
    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
    System.out.print(data[i][j] + "  ");    

您正在向data[i][j] 写入两次,因此覆盖了

返回的第一个值
(float) IOUtil.skipToDouble(scan);

如果没有看到您的输入文件,很难判断代码应该是什么,但我认为您正在寻找这样的东西:

public static float[][] data(float[][] data, Scanner scan)
    for (int i = 0; i < data.length; i++) 
        for (int j = 0; j < data[i].length; j++) 
            data[i][j] = (float) IOUtil.skipToDouble(scan); 
            System.out.print(data[i][j] + "  ");    
        
        System.out.println();
    
    return data;

【讨论】:

我已经将输入文件的内容放在了帖子上。不过,我会进行编辑以使其更清晰,因为我可以看到它可能不是这样。 还要回答你的问题,我想阅读第一个和第二个值,然后换行。 如果您向我们展示 IOUtil.skipToDouble(Scanner) 的作用,我们可以为您提供更好的帮助 它会跳过任何不是数值的东西,如果你有一个带有标签的文件但这个特定文件真的不需要,这很有用!【参考方案4】:

将数据放入二维数组时,您正在覆盖内容 在 for 循环 for(int k=0;k&lt;2; k++) 中两次的数组。为了 示例:考虑 i = 0 时的情况:

    在 k = 0 时,数据[0][0] = 13.97 在 k = 1 时,data[0][0] = 2.2(覆盖 13.97)而您正在寻找的期望结果是 data[0][0] = 13.97 和 数据[0][1]=2.2

您应该使用以下代码来填充二维数组:

public static float[][] data(float[][] data, Scanner scan)
    int count = 0; 

    for (int i=0;i<data.length;i++)
        for (int j=0;j<data[0].length;j++)
            count++;    
            if(count<data.length*data[0].length)
                for(int k=0;k<2; k++)

                    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                    System.out.print(data[i][j] + "  ");    
                    j = j+1;
                

            System.out.println();
               
        

    
    return data;    


并使用以下代码读取数据:

public static void printX(float[][] data)

    for (int i=0;i<data.length;i++)
    
        System.out.println(data[i][0]);
    

另外如果条件 if(count&lt;data.length*data[0].length)i 的某个值失败,那么在这种情况下,您将拥有 data[i][0] = 0 和 数据[i][1] = 0 。你也应该考虑这个事实并且应该期待 0 作为 printX 的一些输出。

【讨论】:

【参考方案5】:

检查此解决方案

public static void main(String[] arg) 
    int a[][] =   1, 2, 3 ,  4, 9, 6 ,  5, 7, 9  ;// new int[3][3];

    for(Values val:getValues(a, 1))
        fillRow(a, val.row);
        fillCol(a, val.col);
    
    
   printAll(a);


private static List<Values> getValues(int a[][], int ele)
    List<Values> list = new ArrayList<Values>();
    for(int i=0;i<a.length;i++)
        for(int j=0;j<a[i].length;j++)
            if(a[i][j] == ele)
                list.add(new Values(i,j));
            
        
    
    return list;


private static class Values
    public Values(int i, int j) 
        row = i;
        col = j;
    
    int row;
    int col;


private static void printAll(int a[][])
    for(int i[]:a)
        for(int j:i)
            System.out.print(" "+j);
        
        System.out.println("\n");
    


private static void fillRow(int a[][], int row)
    for(int i=0;i<a.length;i++)
        a[i][row] = 0;
    


private static void fillCol(int a[][], int col)
    for(int i=0;i<a.length;i++)
        a[col][i] = 0;
    

【讨论】:

以上是关于如何从二维数组中获取第一列的内容的主要内容,如果未能解决你的问题,请参考以下文章

获取二维数组中某一列的最小值

JAVA中如何对二维数组的每一列进行排序

怎样用sort和qsort对二维数组排序

JAVA中如何对二维数组的每一列进行排序

JAVA如何以数组中的一列作为标准进行排序。

C语言中如何取二维数组的一行(一列)?