L2CCCP
9 уровень
Калининград

Оператор деления по модулю

Пост из группы Архив info.javarush.ru
3681 участников
Оператор деления по модулю - оператор mod, обозначается символом %.
Этот оператор возвращает остаток от деления первого операнда на второй. Оператор mod "%" в Java работает не только с целыми (такие как: byte/int/short/long), но и с плавающей точкой (такие как: float/double) числами\типами. Приведенная ниже программа иллюстрирует работу этого оператора:
package com.l2cccp.work;

public class Mod
{
	public static void main(String args[])
	{
		int i = 17; // Целые
		double d = 17.3; // С плавающей точкой

		System.out.println("i mod 10 = " + i % 10);
		System.out.println("d mod 10 = " + d % 10);
	}
}
Выполнив эту программу, вы получите следующий результат:
i mod 10 = 7
d mod 10 = 7.300000000000001
С работой данного оператора разобрались, но как же его использовать. Как вариант для склонения слов в зависимости от количества. Так как я работаю разработчиком эмулятора игры на java для меня очень важно чтобы многие слова в сообщениях склонялись. К примеру:
  1. Вы играете уже 1 день.
  2. Вы играете уже 2 дня.
  3. Вы играете уже 5 дней.
Напишем программу склонения:
package com.l2cccp.work;

public class Mod
{
	public static void main(String args[])
	{
		int[] day= new int[] { 1, 2, 5 };

		System.out.println("Вы играете уже " + day[0] + " " + declension(day[0]));
		System.out.println("Вы играете уже " + day[1] + " " + declension(day[1]));
		System.out.println("Вы играете уже " + day[2] + " " + declension(day[2]));
	}

	public static String declension(int count)
	{
		String one = "день";
		String two = "дня";
		String five = "дней";

		if(count > 100)
			count %= 100;

		if(count > 20)
			count %= 10;

		switch(count)
		{
			case 1:
				return one;
			case 2:
			case 3:
			case 4:
				return two;
			default:
				return five;
		}
	}
}
Выполнив эту программу, вы получите следующий результат:
Вы играете уже 1 день
Вы играете уже 2 дня
Вы играете уже 5 дней
Все работает так как нам нужно, но что если нам потребуется получить несколько склонении в одном результате? К примеру:
  1. Вы играете уже 1 день и 1 час.
  2. Вы играете уже 2 дня и 4 часа.
  3. Вы играете уже 5 дней 9 часов.
Не писать же нам дополнительный метод склонения для каждого слова, которое нам понадобится. Напишем программу склонения по типу:
package com.l2cccp.work;

public class Mod
{
	public static void main(String args[])
	{
		int[] day = new int[] { 1, 2, 5 };
		int[] hour = new int[] { 1, 4, 9 };

		System.out.println("Вы играете уже " + day[0] + " " + declension(day[0], "Days") + " и " + hour[0] + " " + declension(hour[0], "Hour"));
		System.out.println("Вы играете уже " + day[1] + " " + declension(day[1], "Days") + " и " + hour[1] + " " + declension(hour[1], "Hour"));
		System.out.println("Вы играете уже " + day[2] + " " + declension(day[2], "Days") + " и " + hour[2] + " " + declension(hour[2], "Hour"));
	}

	public static String declension(int count, String type)
	{
		String one = "";
		String two = "";
		String five = "";

		if(type.equals("Days"))
		{
			one = "день";
			two = "дня";
			five = "дней";
		}
		else if(type.equals("Hour"))
		{
			one = "час";
			two = "часа";
			five = "часов";
		}

		if(count > 100)
			count %= 100;

		if(count > 20)
			count %= 10;

		switch(count)
		{
			case 1:
				return one;
			case 2:
			case 3:
			case 4:
				return two;
			default:
				return five;
		}
	}
}
Выполнив эту программу, вы получите следующий результат:
Вы играете уже 1 день и 1 час
Вы играете уже 2 дня и 4 часа
Вы играете уже 5 дней и 9 часов
Так как наш метод описан как паблик "public" то вызвать его можно легко из любого пакета:
Mod.declension(count, type);
Собственно вот и все, надеюсь кому то это будет полезно. Удачи в освоении Java языка.
Комментарии (4)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизироваться
Dem 9 уровень
2 июня 2017, 15:57
Хотел бы добавить что число большее 99 например 1234%10 выдаст нам ответ соответсвенно 4. Везде почему то в примерах стоят 2-х значные числа.
1234%100 =34 и так далее.
FriDayXIII 15 уровень
27 августа 2013, 15:01
Интересная статья, не думал что подстановку «день, дней, дня» можно так довольно таки просто реализовать.
Я лишь начинаю осваивать Java да и программирование в целом, но мене буквально сегодня показали изъян в одной из моих программок, касающийся сравнения переменно с словом:
«Единственный момент, который хотелось бы упомянуть – сравнение с литералами. Я часто вижу конструкции типа
str.equals("abc")
. И тут есть небольшие грабли – перед этим сравнением правильно бы было сравнить
str с null
, чтобы не получить
NullPointerException
. Т.е. правильной будет конструкция
str != null && str.equals("abc")
. Между тем – ее можно упростить. Достаточно написать всего лишь
"abc".equals(str)
. Проверка на
null
в этом случае не нужна.»

Хотя наверное для вашей конкретной задачи это не важно, так как если кто то воспользовался
declension(int count, String type)
то перемення
type
по любому будет задана.
L2CCCP 9 уровень, Калининград
27 августа 2013, 17:15
Да, сравнивать строки на null конечно нужно, но в данном случаи даже если переменная type будет задана не правильно или будет просто пуста ошибку мы не получим так как переменные типы склонения уже определены по стандарту как пустые строки.

Как пример:
package com.l2cccp.work;

public class Mod
{
	public static void main(String args[])
	{
		int[] day = new int[] { 1, 2, 5 };
		int[] hour = new int[] { 1, 4, 9 };

		System.out.println("Вы играете уже " + day[0] + " " + declension(day[0], "") + " и " + hour[0] + " " + declension(hour[0], "Hour"));
		System.out.println("Вы играете уже " + day[1] + " " + declension(day[1], "Days") + " и " + hour[1] + " " + declension(hour[1], "Hour"));
		System.out.println("Вы играете уже " + day[2] + " " + declension(day[2], "Days") + " и " + hour[2] + " " + declension(hour[2], "Hour"));
	}

	public static String declension(int count, String type)
	{
		String one = "(не определено)";
		String two = "(не определено)";
		String five = "(не определено)";

		if(type.equalsIgnoreCase("Days"))
		{
			one = "день";
			two = "дня";
			five = "дней";
		}

		if(type.equals("Hour"))
		{
			one = "час";
			two = "часа";
			five = "часов";
		}

		if(count > 100)
			count %= 100;

		if(count > 20)
			count %= 10;

		switch(count)
		{
			case 1:
				return one;
			case 2:
			case 3:
			case 4:
				return two;
			default:
				return five;
		}
	}
}

В ходе выполнения программы мы получим результат без NPE:
Вы играете уже 1 (не определено) и 1 час
Вы играете уже 2 дня и 4 часа
Вы играете уже 5 дней и 9
FriDayXIII 15 уровень
27 августа 2013, 17:20
Ясно, одно плохо, ваша статья так запрятана, что и не найдешь… но это больше укор администраторам проекта info.javarush.