使用输入文件:输出中值(Java)

时间:2012-12-21 17:43:51

标签: java

到目前为止,我一直在研究这个问题。我已经迷失了一段时间,因为我不知道如何更改数组int m[] = new int[variable]中的项数或删除零/移位数组。零是问题所在,因为我需要对数组进行排序并找到中位数。

这是作业:

  

任务说明

     

中位数在统计领域扮演着重要角色。根据定义,它是一个将数组分成两个相等部分的值。在这个问题中,你要确定一些长整数的当前中位数。

     

假设我们有五个数字{1,3,6,2,7}。在这种情况下,3是中位数,因为它的每一侧都有两个数字。 {1,2}和{6,7}。

     

如果有偶数个值如{1,3,6,2,7,8},则只有一个值不能将此数组拆分为相等的两个部分,因此我们考虑中间值的平均值{3,6 }。因此,中位数将是(3 + 6)/ 2 = 4.5。在这个问题中,您只需要打印整数部分,而不是小数部分。结果,根据这个问题,中位数将是4!

     

节目输入

     

输入文件(c:\ codewars \ prob06.in)包含多个整数X(0 <= X <2 ^ 31)并且整数N的总数小于10000.输入文件将包含一个'0'表示整数列表的结尾。当您读入'0'时,您的程序必须退出而不计算数字为0的新中位数。

1 3 4 60 70 50 2 0 
     

节目输出

     

读入每个数字后,重新计算中位数并将其显示在屏幕上。

1 2 3 3 4 27 4 

到目前为止,这是我的尝试:

import java.util.*;
import java.io.*;

public class Median {
    public static void main (String args[]) {

        String fileName = "textfile.txt";

        //Labels scanner
        Scanner inputStream = null;
        int fileLen=0;
        int[] m = new int[1000];


        try{
            inputStream = new Scanner (new File (fileName));
            LineNumberReader lnr = new LineNumberReader(new FileReader(new File(fileName)));
            lnr.skip(Long.MAX_VALUE);
            fileLen = lnr.getLineNumber();
        }
        catch(Exception e) {
            System.out.println("Could not open the file named: " + fileName);
            System.exit(0);
        }

        int middle = 0;

        for (int counter=0;counter<fileLen && inputStream.hasNextInt();counter++){

            int unChecked = inputStream.nextInt();
            if (unChecked != 0) {
                m[counter]=unChecked;
                removeZeros(m);
                median(m, fileLen);
                //Arrays.sort(m);
            }else if (unChecked == 0){
                counter+=fileLen;
            }
        }
        }









    public static int median(int m[],int fileLen) {
        int[] b = new int[fileLen];
        System.arraycopy(m, 0, b, 0, b.length);
        Arrays.sort(b);
        System.out.println(b[1]);
        if (m.length % 2 == 0) {
        System.out.println((b[(b.length / 2) - 1] + b[b.length / 2]) / 2);
        return (b[(b.length / 2) - 1] + b[b.length / 2]) / 2;
        } else {
        System.out.println(b[b.length / 2]);
        return b[b.length / 2];
        }
    }

    static void removeZeros(int m[]) {

        int counter2=0,counter4=0;
        for(int counter=0;counter<m.length;counter++){
            if (m[counter]!=0){
                counter2++;
                System.out.println(m[counter]);
            }
        }

        int d[] = new int [counter2];
        for(int counter=0;counter<m.length;counter++){
            if (m[counter]==0){
                d[counter4] = m[counter];
                counter4++;
            }
        }

}
}

1 个答案:

答案 0 :(得分:0)

getLineNumber可能总是在程序中返回1(或某个值!=当前位置)。这将导致median的行为不正确并导致程序提前终止。所以摆脱lnrfileLen并将counter+1传递给中位函数。

一些提示:

  • 只需将break;放在if (unChecked == 0)之后。

  • 对于if (unChecked != 0) ... else if (unChecked == 0),您可以删除if (unChecked == 0)

  • 摆脱removeZeros,功能不符合问题的要求。

  • 对每个输入数字排序整个集合是一个坏主意,请查看insertion sort以便随时对其进行排序。