Java: Конструкция else if
Метод getTypeOfSentence различает только вопросительные и обычные предложения. Добавим в него поддержку восклицательных предложений. Сделаем это сначала через две отдельные проверки if:
public static String getTypeOfSentence(String sentence) {
String sentenceType = "";
if (sentence.endsWith("?")) {
sentenceType = "question";
}
if (sentence.endsWith("!")) {
sentenceType = "exclamation";
} else {
sentenceType = "general";
}
return "Sentence is " + sentenceType;
}
App.getTypeOfSentence("Who?"); // "Sentence is general"
App.getTypeOfSentence("No"); // "Sentence is general"
App.getTypeOfSentence("No!"); // "Sentence is exclamation"Технически этот код работает, но вопросительные предложения трактует неверно. Есть и проблема с семантикой. Наличие восклицательного знака проверяется в любом случае, даже когда уже нашелся вопросительный знак. Ветка else относится ко второму условию, но не к первому. Поэтому вопросительное предложение получает тип "general".
Чтобы выстроить проверки в единую цепочку, конструкция if поддерживает ветку else if. Такой вариант подходит, когда проверок много и они исключают друг друга:
if (/* что-то */) {
} else if (/* другая проверка */) {
} else if (/* другая проверка */) {
} else {
}Здесь обратите внимание на два момента:
- Ветка
elseможет отсутствовать - Количество веток
else ifможет быть любым
Перепишем метод с else if:
public static String getTypeOfSentence(String sentence) {
String sentenceType;
if (sentence.endsWith("?")) {
sentenceType = "question";
} else if (sentence.endsWith("!")) {
sentenceType = "exclamation";
} else {
sentenceType = "general";
}
return "Sentence is " + sentenceType;
}
App.getTypeOfSentence("Who?"); // "Sentence is question"
App.getTypeOfSentence("No"); // "Sentence is general"
App.getTypeOfSentence("No!"); // "Sentence is exclamation"Теперь все условия выстроены в единую конструкцию. Оператор else if означает "если не выполнено предыдущее условие, но выполнено текущее".
┌────────────┐
│ условие 1? │
└──────┬─────┘
┌──────────┴──────────┐
true │ │ false
↓ ↓
┌─────────┐ ┌────────────┐
│ тело if │ │ условие 2? │
└─────────┘ └──────┬─────┘
┌──────┴───────┐
true │ │ false
↓ ↓
┌──────────────┐ ┌───────────┐
│ тело else if │ │ тело else │
└──────────────┘ └───────────┘Логика метода устроена так:
- Если последний символ
?, то тип"question" - Иначе, если последний символ
!, то тип"exclamation" - Иначе тип
"general"
В итоге выполнится только один из блоков, относящихся ко всей конструкции if.
Задание
На электронной карте Вестероса, которую реализовал Сэм, союзники Старков отображены зеленым кружком, враги — красным, а нейтральные семьи — серым.
Напишите для Сэма метод whoIsThisHouseToStarks(), который принимает на вход фамилию семьи и возвращает одно из трех значений: "friend", "enemy", "neutral".
Правила определения:
- Друзья (
"friend"): "Karstark", "Tally" - Враги (
"enemy"): "Lannister", "Frey" - Любые другие семьи считаются нейтральными
Примеры вызова:
App.whoIsThisHouseToStarks("Karstark"); // "friend"
App.whoIsThisHouseToStarks("Frey"); // "enemy"
App.whoIsThisHouseToStarks("Joar"); // "neutral"
App.whoIsThisHouseToStarks("Ivanov"); // "neutral"Java: Конструкция else if
Метод getTypeOfSentence различает только вопросительные и обычные предложения. Добавим в него поддержку восклицательных предложений. Сделаем это сначала через две отдельные проверки if:
public static String getTypeOfSentence(String sentence) {
String sentenceType = "";
if (sentence.endsWith("?")) {
sentenceType = "question";
}
if (sentence.endsWith("!")) {
sentenceType = "exclamation";
} else {
sentenceType = "general";
}
return "Sentence is " + sentenceType;
}
App.getTypeOfSentence("Who?"); // "Sentence is general"
App.getTypeOfSentence("No"); // "Sentence is general"
App.getTypeOfSentence("No!"); // "Sentence is exclamation"Технически этот код работает, но вопросительные предложения трактует неверно. Есть и проблема с семантикой. Наличие восклицательного знака проверяется в любом случае, даже когда уже нашелся вопросительный знак. Ветка else относится ко второму условию, но не к первому. Поэтому вопросительное предложение получает тип "general".
Чтобы выстроить проверки в единую цепочку, конструкция if поддерживает ветку else if. Такой вариант подходит, когда проверок много и они исключают друг друга:
if (/* что-то */) {
} else if (/* другая проверка */) {
} else if (/* другая проверка */) {
} else {
}Здесь обратите внимание на два момента:
- Ветка
elseможет отсутствовать - Количество веток
else ifможет быть любым
Перепишем метод с else if:
public static String getTypeOfSentence(String sentence) {
String sentenceType;
if (sentence.endsWith("?")) {
sentenceType = "question";
} else if (sentence.endsWith("!")) {
sentenceType = "exclamation";
} else {
sentenceType = "general";
}
return "Sentence is " + sentenceType;
}
App.getTypeOfSentence("Who?"); // "Sentence is question"
App.getTypeOfSentence("No"); // "Sentence is general"
App.getTypeOfSentence("No!"); // "Sentence is exclamation"Теперь все условия выстроены в единую конструкцию. Оператор else if означает "если не выполнено предыдущее условие, но выполнено текущее".
┌────────────┐
│ условие 1? │
└──────┬─────┘
┌──────────┴──────────┐
true │ │ false
↓ ↓
┌─────────┐ ┌────────────┐
│ тело if │ │ условие 2? │
└─────────┘ └──────┬─────┘
┌──────┴───────┐
true │ │ false
↓ ↓
┌──────────────┐ ┌───────────┐
│ тело else if │ │ тело else │
└──────────────┘ └───────────┘Логика метода устроена так:
- Если последний символ
?, то тип"question" - Иначе, если последний символ
!, то тип"exclamation" - Иначе тип
"general"
В итоге выполнится только один из блоков, относящихся ко всей конструкции if.
Задание
На электронной карте Вестероса, которую реализовал Сэм, союзники Старков отображены зеленым кружком, враги — красным, а нейтральные семьи — серым.
Напишите для Сэма метод whoIsThisHouseToStarks(), который принимает на вход фамилию семьи и возвращает одно из трех значений: "friend", "enemy", "neutral".
Правила определения:
- Друзья (
"friend"): "Karstark", "Tally" - Враги (
"enemy"): "Lannister", "Frey" - Любые другие семьи считаются нейтральными
Примеры вызова:
App.whoIsThisHouseToStarks("Karstark"); // "friend"
App.whoIsThisHouseToStarks("Frey"); // "enemy"
App.whoIsThisHouseToStarks("Joar"); // "neutral"
App.whoIsThisHouseToStarks("Ivanov"); // "neutral"Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
class AppTest {
public static void main(String[] args) {
assertThat(App.whoIsThisHouseToStarks("Tally")).isEqualTo("friend");
assertThat(App.whoIsThisHouseToStarks("Karstark")).isEqualTo("friend");
assertThat(App.whoIsThisHouseToStarks("Lannister")).isEqualTo("enemy");
assertThat(App.whoIsThisHouseToStarks("Martell")).isEqualTo("neutral");
assertThat(App.whoIsThisHouseToStarks("undefined")).isEqualTo("neutral");
}
}Решение учителя откроется через:
20:00
