7.000
7.000
12.000
7.000
7.000
Should yield the output:
10.000
12.000
Since 10 and 12 each vary by more than 50% from the median of the previous 3 values.
package bridgewater;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MovingMedianSolution {
private List
inputs = new ArrayList
(); private int winSize = 0; private double maxChange = 0; public MovingMedianSolution(){ } public static void main(String[] args) throws Exception { BufferedReader br = null; MovingMedianSolution solution = new MovingMedianSolution(); try { InputStream inputStream = new FileInputStream(input2.txt); Reader reader = new InputStreamReader(inputStream); br = new BufferedReader(reader); // br = new BufferedReader(new InputStreamReader(System.in)); solution.winSize = Integer.parseInt(br.readLine()); solution.maxChange = Double.parseDouble(br.readLine()); String input = br.readLine(); while(input != null){ solution.inputs.add(input); solution.process(solution.inputs); input = br.readLine(); } } finally { if (br != null) br.close(); } } public void process(List
inputs) { if(winSize<=0 || maxChange<0 || inputs.size() < winSize+1){ return; } ArrayList
al = new ArrayList
(); for(int i=inputs.size()-2; i>=inputs.size()-1-winSize; i--){ al.add(Double.parseDouble(inputs.get(i))); } Collections.sort(al); double median = al.get(al.size()/2); // even size if((al.size() & 1) == 0){ // When it is odd size median = al.get(al.size()/2-1); } double cur = Double.parseDouble(inputs.get(inputs.size()-1)); if(Math.abs(cur-median)*1.0/median > maxChange){ System.out.println(String.format(%.3f, cur)); } } }