Mit diesem Programm möchte ich die Zahlen, die ich in einer Textdatei angegeben habe, lesen und vergleichen und ausdrucken "kaufen" , wenn die Zahl drei Mal hintereinander steigt, und "verkaufen" , wenn die Zahl drei Mal hintereinander sinkt.

Das Problem mit meinem Programm ist, dass es nur 13 der 15 Zeilen der "numbers.txt" liest und der Kauf-Verkauf an falschen Stellen erfolgt.

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
import java.text.DecimalFormat;

public class Practise {
    public static void main(String[] args) throws IOException {
        int num = 0;
        int up = 0;
        int down = 0;
        int same = 0;
        FileInputStream file = new FileInputStream("numbers.txt");
        Scanner scanner = new Scanner(file);
        while (scanner.hasNextDouble()) {
            Double[] array = new Double[15];
            for (int i = 0; i < array.length; i++) {
                array[i] = scanner.nextDouble();
            }
            for (int a = 0; a < array.length && a + 1 < array.length - 1; a++) {
                num++;
                System.out.print(num + "  " + (array[a]));
                if (array[a] < array[a + 1]) {
                    up++;
                } else if (array[a] > array[a + 1]) {
                    down++;
                } else {
                    same++;
                }
                if ((up >= 3 && (down > 1 || same >= 1))) {
                    System.out.print("  " + "sell");
                    up = 0;
                    same = 0;
                } else if ((down >= 3 && (up > 1 || same >= 1))) {
                    System.out.print("  " + "buy");
                    down = 0;
                    same = 0;
                }
                System.out.println();
            }
        }
    }
}

Die Dateinummern.txt:

26.375
25.500
25.125
25.000
25.250
27.125
28.250
26.000
25.500
25.000
25.125
25.250
26.375
25.500
25.500

Erwartete Ausgabe:

1 26.375
2 25.500
3 25.125
4 25.000
5 25.250 kaufen
6 27.125
7 28.250
8 26.000 verkaufen
9 25.500
10 25.000
11 25.125 kaufen
12 25.250
13 26.375
14 25.500 verkaufen
15 25.500

0
John Trib 4 Jän. 2016 im 16:37

2 Antworten

Beste Antwort

Sie verwenden a + 1 < array.length - 1, das in a < array.length - 2 umgewandelt werden kann. Ich denke, Sie verstehen, dass der zweite Operand in & amp; & amp; begrenzt Ihre Iteration auf 13.

a < array.length && a < array.length - 2 = a < 15 && a < 13 = a < 13

Ich habe einige geringfügige Änderungen an Ihrem Code vorgenommen, damit er funktioniert. Sie könnten es viel umgestalten, aber ich bleibe bei Ihrem Stil, damit Sie die Logik besser verstehen können.

    int num = 1;
    //print the 1st element
    System.out.println(num + "  " + array[0]);
    for (int a = 1; a < array.length; a++) {
        num++;
        System.out.print(num + "  " + (array[a]));
        //plz note that we check with the before, not after
        if (array[a] < array[a - 1]) {
            down++;
        } else if (array[a] > array[a - 1]) {
            up++;
        } else {
            same++;
        }
        //changed down > to down ==
        if ((up >= 3 && (down == 1 || same >= 1))) {
            System.out.print("  " + "sell");
            up = 0;
            same = 0;
        } 
        //changed up > to up ==
        else if ((down >= 3 && (up == 1 || same >= 1))) {
            System.out.print("  " + "buy");
            down = 0;
            same = 0;
        }
        System.out.println();
    }

Antwort auf OP-Kommentar: Wenn Sie mehr als 15 Datensätze unterstützen möchten, können Sie diese weiterhin zu einer Liste hinzufügen:

List<Double> list = new ArrayList<>();
while (scanner.hasNextDouble()) {
    list.add(scanner.nextDouble());
}
//if you want to work with array
Double[] array = new Double[list.size()];
array = list.toArray(array);
0
Kostas Chalkias 4 Jän. 2016 im 18:23

Hier ist ein funktionierendes Beispiel (musste Array in Liste ändern)

int num = 0, up = 0, down = 0, same = 0;

FileInputStream file = new FileInputStream("numbers.txt");
Scanner scanner = new Scanner(file);
List<Double> list = new ArrayList<>();

while (scanner.hasNextDouble()) {
    list.add(scanner.nextDouble());
}

int position = 0;

while (position + 2 < list.size()) {
    Double[] nums = new Double[3];

    System.out.println(nums[0] = list.get(position));
    System.out.println(nums[1] = list.get(position + 1));
    System.out.println(nums[2] = list.get(position + 2));

    if (nums[1] > nums[0] && nums[2] > nums[1]) {
        System.out.println("buy");
        up++;
    } else if (nums[1] < nums[0] && nums[2] < nums[1]) {
        System.out.println("sell");
        down++;
    } else {
        same++;
    }
    position += 2;
}
System.out.println("Ups total: " + up);
System.out.println("Downs total: " + down);
System.out.println("Same total: " + same);
0
Tom 4 Jän. 2016 im 13:59