Как получить и сохранить индекс из 2D-массива - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть список двухмерных массивов, в котором в каждой строке случайным образом перемешаны команды 1-4.У меня есть отдельный массив для каждой команды, в котором я хочу сохранить свой индекс.Например, если мой 2D-массив выглядит так:

2, 3, 1, 4

2, 1, 4, 3

4, 2, 1, 3

Мой массив для индексов team1 должен быть [2,1,2], команда 2 должна быть [0, 0, 1], команда 3 должна быть [1, 3, 3], а команда 4 должна быть [3, 2, 0].

Однако у меня возникли проблемы с реализацией цикла, который может идентифицировать индекс каждого числа и добавить его в соответствующий массив, а затем перейти к следующей строке.Я получаю значение -1 (это означает, что запрошенное число не существует).Может кто-нибудь взглянуть на то, что у меня есть, и предложить помощь?

Просто немного предыстории (потому что у меня здесь есть кое-что еще): массив, в котором я храню перемешанные числа, является динамическим.Перемешанные числа добавляются только в том случае, если входное значение температуры выше 32. Если входное значение температуры ниже 32 в течение трех раз подряд, то цикл завершается.

package practice;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;

public class everythingTogether {
  public static void main(String[] args) {
    //Create Arrays
    //Store Temperatures
    ArrayList < Double > allTemperatures = new ArrayList < > ();
    ArrayList < Double > daysPlayed = new ArrayList < > ();
    List < Integer[] > teamMatches = new ArrayList < > ();

    //make array list for team index (0,1 home| 2,3 away)
    ArrayList < Integer > homeOrAway1 = new ArrayList < > ();
    ArrayList < Integer > homeOrAway2 = new ArrayList < > ();
    ArrayList < Integer > homeOrAway3 = new ArrayList < > ();
    ArrayList < Integer > homeOrAway4 = new ArrayList < > ();




    //start loop for temp and datat collection
    for (int j = 0;; j++) {
      Integer[] teamNums = new Integer[] {
        1,
        2,
        3,
        4
      };

      //scanner for temperature
      Scanner getTemp = new Scanner(System.in);
      System.out.println("What is today's temperature?");
      double temp = getTemp.nextDouble();
      allTemperatures.add(temp);

      //checking temperature and if can play
      if (j < 2) {
        if (temp < 32) {
          System.out.println("It is too cold to play.");
        } else {
          Collections.shuffle(Arrays.asList(teamNums));
          teamMatches.add(teamNums);
          daysPlayed.add(temp);
        }
      }

      //after day 0 and 1 check if season can be over
      else if (j >= 2) {
        if (temp < 32) {
          System.out.println("It is too cold to play.");

          //check if season over
          double day1Temp = allTemperatures.get(j);
          double day2Temp = allTemperatures.get((j - 1));
          double day3Temp = allTemperatures.get((j - 2));
          if (day1Temp < 32 & day2Temp < 32 & day3Temp < 32) {
            System.out.println("The season is over");
            break;
          }
        } else {
          Collections.shuffle(Arrays.asList(teamNums));
          teamMatches.add(teamNums);
          daysPlayed.add(temp);
        }
      }
    }

    System.out.println("_______________________");

    //get home teams and away teams

    for (int i = 0; i < teamMatches.size(); i++) {

      int team1Status = teamMatches.indexOf(1);
      int team2Status = teamMatches.indexOf(2);
      int team3Status = teamMatches.indexOf(3);
      int team4Status = teamMatches.indexOf(4);

      homeOrAway1.add(team1Status);
      homeOrAway2.add(team2Status);
      homeOrAway3.add(team3Status);
      homeOrAway4.add(team4Status);
    }


    System.out.println(homeOrAway1);
    System.out.println(homeOrAway2);
    System.out.println(homeOrAway3);
    System.out.println(homeOrAway4);


  }
}

1 Ответ

0 голосов
/ 18 ноября 2018

Я полагаю, что ошибка, которую вы получаете, связана с этим циклом:

for (int i = 0; i < teamMatches.size(); i++) {

  int team1Status = teamMatches.indexOf(1);
  int team2Status = teamMatches.indexOf(2);
  int team3Status = teamMatches.indexOf(3);
  int team4Status = teamMatches.indexOf(4);

  homeOrAway1.add(team1Status);
  homeOrAway2.add(team2Status);
  homeOrAway3.add(team3Status);
  homeOrAway4.add(team4Status);
}

Имейте в виду, что это ваше заявление:

List < Integer[] > teamMatches

teamMatches - это списокцелочисленного массива.Поэтому, когда вы звоните:

int team1Status = teamMatches.indexOf(1); 

, вы не получаете то, что думаете.Вот что на самом деле teamMatches: Representation of teamMatches

То, что вы на самом деле хотите, это:

for (int i = 0; i < teamMatches.size(); i++) {

        Integer[] ints = teamMatches.get(i);
        for (int j = 0; j < ints.length; j++) {
            if (ints[j] == 1) homeOrAway1.add(j);
            else if (ints[j] == 2) homeOrAway2.add(j);
            else if (ints[j] == 3) homeOrAway3.add(j);
            else if (ints[j] == 4) homeOrAway4.add(j);
        }
    }

Редактировать: я собираюсь добавить объяснение, так что повесьтев тесном.

teamMatches - это список массивов целых чисел.Массив является представлением 1,2,3,4 (скремблировано), что по сути является представлением для игры.Поскольку существует список этого, teamMatches - это список игр.

Integer[] ints = teamMatches.get(i) - это то, что вы действительно хотите.Теперь переменная ints является одиночной игрой.Из этой одиночной игры вы можете извлечь информацию о позициях каждой команды (не уверен насчет терминологии, извините).

Остальная часть внутреннего цикла должна быть понятной.Он перебирает массив целых чисел (положение команд) и добавляет текущий индекс к homeOrArray1 / 2/3/4 в зависимости от значения в индексе.

ПРИМЕЧАНИЕ: I сильно рекомендую никогда не использовать массив целых чисел, если нет веских причин для этого.Я верю, что вы действительно хотите List<Integer>, потому что теперь вы можете просто сделать ints.indexOf(1/2/3/4); вместо цикла for.

Очевидно, я не знаю спецификацию вашей программы, но при условии, что вы 'Если переопределить teamMatches, то следующий код намного чище imo.

List<List<Integer>> teamMatches = new ArrayList<>();

...

Теперь весь цикл for можно заменить на:

for (List<Integer> teamPositions : teamMatches) {
        homeOrAway1.add(teamPositions.indexOf(1));
        homeOrAway2.add(teamPositions.indexOf(2));
        //...           
    }
...