Присваивать присваивание до тех пор, пока оно не достигнет числа, после этого другое присваивание и так далее

#java

#java

Вопрос:

Я хочу создать алгоритм, который будет выводить, например, «это нормально» до числа 0.25. И после этого он говорит «предупреждение», поэтому, когда оно достигает 0,3, оно предупреждает одного пользователя (одну переменную, назовем ее person A); Когда значение увеличивается до 0,4, оно предупреждает двух человек (person A и person B); И, наконец, когда оно достигает 0,5, оно предупреждает трех человек (person A, person B, person C).

Итак, я не знаю, какие переменные использовать, но, продвигаясь шаг за шагом, я пришел к следующему;

 import java.util.Scanner;

public class apple {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Scanner mc = new Scanner(System.in);
        double ind;
        ind = mc.nextDouble();

        switch (ind){
        case 0.25:
            System.out.println("Ok");
            break;
        case 0.3:
            System.out.println("Warning");
            break;
        case 0.4:
            System.out.println("danger");
        }
    }

}
  

теперь я знаю, что switch можно использовать только для переменных int. Но я думаю, что моя логика была, по крайней мере, в правильном месте XD.
Кому-нибудь помочь?


Итак, вот с чем я пришел, но теперь у меня новая проблема, я хочу, чтобы значение начиналось с 0 и увеличивалось до 0.25 без того, чтобы кто-либо вводил, я думаю, просто как «для». Я не знаю, может быть, я слишком новичок, чтобы иметь смысл.

 public static void main(String[] args) {

Scanner mc = new Scanner(System.in);
    System.out.println("Level of radiation: ");
    double ind = mc.nextDouble();
    if (ind <= 0.25) {
           System.out.println("Ok");
        } else if (ind <= 0.3) {
           System.out.println("Warning");
        } else if (ind <= 0.4) {
           System.out.println("danger");
        }
}
  

}

Комментарии:

1. Я проголосовал против этого, потому что на самом деле это два вопроса, ни один из которых не очень ясен.

2. Учитывая все ответы, которые JayNpc делал на ответы людей, он недостаточно разбирается в программировании на Java, чтобы завершить этот проект.

Ответ №1:

Возможно, вы будете менее смущены, когда разделите вещи на две переменные: текст и получателей:

 private void sendAllMessages(double ind) {
  String text;
  if (ind < 0.25) {
    text = "Ok";
  } else if (ind < 0.30) {
    text = "Warning";
  } else {
    text = "Danger";
  }

  // A always gets a message
  sendMessage(text, A);

  // B was annoyed of the many messages
  if (ind >= 0.40) {
    sendMessage(text, B);
  }

  // C is really important and has lots of other emails, so keep him quiet
  if (ind >= 0.50) {
    sendMessage(text, C);
  }
}
  

Чтобы протестировать этот код, вам следует написать очень простой sendMessage метод, а затем выполнить следующее:

 @Test
public void testSendMessages() {
  for (int level = 0; level < 100; level  ) {
    double ind = level / 100.0; /* note the ".0" at the end; that's important. */
    sendAllMessages(ind);
  }
}
  

Комментарии:

1. Отлично, структура помогла мне понять намного больше. Но один вопрос, как мне присвоить эти A, B и C переменным там? Он говорит, что B не может быть преобразован в переменную.

2. Почему значение .0 в конце важно? кроме того, уровень означает, что он будет продолжать добавлять, пока не достигнет 100, верно? Так это означает, что с этим кодом пользователю не нужно будет вводить значение?

3. Я не знаю, что такое ваши A , B и C . Возможно, это адреса электронной почты, возможно, почтовые адреса. Это также причина, по которой я не реализовал sendMessage метод. Если это только для тестирования, вы можете просто написать String A = "A", B = "B", C = "C"; .

4. Нет, level только означает добавить единицу к level . Но вместе со всем for циклом это означает начать с level бытия 0 , и пока оно все еще < 100 существует, запустите следующий код, а затем выполните level .

5. Разница между 99 / 100 и 99 / 100.0 очень велика. Первое выражение вычисляется как 0 , потому что деление на целые числа возвращает только целые числа. Второе выражение вычисляется до числа с плавающей запятой, которое очень близко к 0.99 , но это не совсем это значение. Это всего лишь подсказка, так что, как вы видите, еще многому предстоит научиться.

Ответ №2:

как насчет чего-то подобного:

 Map<Float, Person> notificationMap = new TreeMap<Float,Person>();
notificationMap.put(0.1, A);
notificationMap.put(0.3, B);
notificationMap.put(0.4, C);

...

ind = mc.nextDouble();
Collection<Person> persons = notificationMap.headMap(ind).values();

for (Person p : persons) {
  notify(p);
}
  

Я, вероятно, не стал бы реализовывать этот способ по соображениям эффективности, но я думаю, что это очень удобно для чтения.

TreeMap javadoc для получения дополнительной информации.

Комментарии:

1. вау, так много переменных я еще не видел. мне нужно обдумать это. потрудитесь объяснить?

2. ну, древовидная карта — это просто отсортированная карта. в этом случае сортируется по ключам с плавающей запятой. headMap(float) возвращает вложенную карту, содержащую все записи в исходной карте, чей плавающий ключ меньше заданного значения (значение ind), и values() просто возвращает значения вложенной карты, которые в данном случае являются объектами Person. Таким образом, для значения 0.32 вы получите обратно коллекцию = { A, B }

Ответ №3:

В этом случае вам не следует использовать switch, поскольку вы тестируете не «точное» значение, а диапазон:

 if (ind <= 0.25) {
   System.out.println("Ok");
} else if (ind <= 0.3) {
   System.out.println("Warning");
} else if (ind <= 0.4) {
   System.out.println("danger");
}
  

Из комментариев я предполагаю, что вам нужно что-то вроде этого:

 public class Person {

   private double ind;
   private String name;

   public Person(double ind, String name) {
      this.ind = ind;
      this.name = name;
   }

   public void printWarning() {
      if (ind <= 0.25) {
         System.out.println("Ok");
      } else if (ind <= 0.3) {
         System.out.println("Warning");
      } else if (ind <= 0.4) {
        System.out.println("danger");
      }
   }

}
  

Затем вы можете вызвать его следующим образом

 public static void main(String[] args) {
   Person a = new Person(0.25, a);
   Person b = new Person(0.3, b);
   Person c = new Person(0.4, c);

   ArrayList<Person> persons = new ArrayList<Person>();
   persons.add(a);
   persons.add(b);
   persons.add(c);

   foreach (Person p: persons) {
      p.printWarning();
   }
}
  

Комментарии:

1. А если я хочу присвоить этим распечаткам определенную группу? Например, когда оно достигает 0.3, «предупреждение» должно быть доставлено «группе A». Какой должна быть команда?

2. @JayNpc Это полностью зависит от того, как вы реализуете эти группы.

3. @JayNpc Вы должны каким-то образом представлять эти группы в коде. Является ли Group классом? Или просто переменная?

4. Это как-то похоже на то, что сказал @Asaf. Я должен был сказать, что я хочу связать результаты переменной с «person A», если это вообще имеет какой-либо смысл. Позвольте мне перефразировать: если (ind <= 0.25), чем пользователь A, считывает OK, иначе (ind <= 0.4), чем пользователи A и B, считывает опасность.

5. @JayNpc Затем я бы создал класс group, состоящий из имени и переменной ind .