Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сравнение параметров объектов / 22 сообщений из 22, страница 1 из 1
02.10.2013, 00:28:35
    #38413734
Leyla89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Фабрика из десяти юзеров в HashMap. Возраст - рандомные значения от 0 до 100. Когда будут перебираться в for: если два юзера с одинаковым возрастом, то клонировать одного из них. Не могу понять как это сделать с for. Думала с массивом из объектов, но тоже непонятно как там взять age. Поставьте на путь истинный.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
public class User implements Cloneable{
 private int age = (int)(Math.random()*100);
 private int growth; 
private int weight; 
private String name;
public User(String name){
    this.name = name;
}
public int hashCode(){
    final int prime = 55;
    int result = 1;
    result = prime * result + growth;
    result = prime * result + weight;
    return result;
}
public User clone() throws CloneNotSupportedException{ 
    return (User) super.clone();
}
public boolean equals(Object obj){
    if(this == obj){
        return true;}
    if(obj == null){
        return false;
    }
    if(getClass() == obj.getClass()){
        return false;
    }
    User other = (User)obj;
    if(growth != other.growth){
        return false;
    }
    if(weight != other.weight){
        return false;
    }
    if(name != other.name){
        return false;
    }
    if(age != other.age){
        return false;
    }
    return true;
}
public int getAge(){
    return age;
}
public int getGrowth(){
    return growth;
}
public void setGrowthWeight(int growth, int weight){
    this.growth = growth;
    this.weight = weight;
}
public int getWeight(){
    return weight;
}
public String getName(){
    return name;
}
public static void main(String[] args) {        
    Map<User, Integer> map = new HashMap<User, Integer>();
    User u = new User("Emily");
    u.setGrowthWeight(165, 60);
    User u1 = new User("Emma");
    u1.setGrowthWeight(170, 65);
    User u2 = new User("Michael");
    u2.setGrowthWeight(180, 80);
    User u3 = new User("Andrew");
    u3.setGrowthWeight(180, 70);
    User u4 = new User("Isabella");
    u4.setGrowthWeight(158, 46);
    User u5 = new User("John");
    u.setGrowthWeight(164, 62);
    User u6 = new User("Samuel");
    u6.setGrowthWeight(184, 83);
    User u7 = new User("Anna");
    u7.setGrowthWeight(165, 53);
    User u8 = new User("Jasmine");
    u8.setGrowthWeight(168, 60);
    User u9 = new User("Robert");
    u9.setGrowthWeight(193, 78);
    map.put(u, 1);
    map.put(u1, 2);
    map.put(u2, 3);
    map.put(u3, 4);
    map.put(u4, 5);
    map.put(u5, 6);
    map.put(u6, 7);
    map.put(u7, 8);
    map.put(u8, 9);
    map.put(u9, 10);
    for(Entry<User, Integer> entry : map.entrySet()){
        System.out.println(entry.getKey() + " " + entry.getValue());
    }           
}
}
...
Рейтинг: 0 / 0
02.10.2013, 00:42:18
    #38413740
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Leyla89,
Есть не такое сумбурное описаниезадачи? Кстати не используйте Cloneable ни при каких условиях, это устаревший подход. Лучше воспользоваться статическим методом генерации, который принимает User и на основе полей создает новый объект
...
Рейтинг: 0 / 0
02.10.2013, 02:35:54
    #38413764
Leyla89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
забыл ник, спасибо
...
Рейтинг: 0 / 0
02.10.2013, 13:07:01
    #38414185
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
забыл ник,

авторне используйте Cloneable ни при каких условиях, это устаревший подход

Что в этом плохого? почему устарел?
...
Рейтинг: 0 / 0
02.10.2013, 14:08:20
    #38414273
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Вы действительно странно ставите задачу.

Если я всё правильно понимаю, вы можете использовать обычный перебор.

Поочерёдно берёте объекты из сета, запускаете новый цикл, опять же по сету, и сравниваете значение возраста юзеров.

Код: java
1.
2.
3.
4.
5.
6.
7.
for(User userOut : userSet) {
	for(User userIn : userSet) {
		if (userOut.getAge() == userIn.getAge()) {
			//logic
		}
	}
 }



Совершенно непонятно зачем вам там мап, и также зачем вам этих юзеров клонировать.
...
Рейтинг: 0 / 0
02.10.2013, 15:12:48
    #38414393
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
...
Рейтинг: 0 / 0
02.10.2013, 15:35:09
    #38414439
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Код: java
1.
2.
3.
4.
5.
6.
7.
for(User userOut : userSet) {
	for(User userIn : userSet) {
		if (userOut.getAge() == userIn.getAge()) {
			//logic
		}
	}
 }


- сложность O(n 2 )
на самом деле задача решается за 1 проход (сложность O(n)), например, используя карту, либо массив
Код: java
1.
User[] distinctAges = new User[100];
...
Рейтинг: 0 / 0
02.10.2013, 15:43:47
    #38414463
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
ivanra ,
Такую задачу ну никак нельзя решить за O(n), ибо алгоритмически это нечто вроде сортировки. n ln n более реально.

З.Ы.: "Карта" уж очень режет слух. Это все равно, что "английский язык" перевести как "english tongue"
...
Рейтинг: 0 / 0
02.10.2013, 15:43:49
    #38414464
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Даешь пример на Guava или Java 8!
...
Рейтинг: 0 / 0
02.10.2013, 15:47:37
    #38414477
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
cdtyjvЭто все равно, что "английский язык" перевести как "english tongue"
Не самый удачный пример. Смотри mother tongue, native tongue.
...
Рейтинг: 0 / 0
02.10.2013, 16:01:58
    #38414520
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Blazkowicz ,
Да, пример не очень. Тогда классика: how much watch
...
Рейтинг: 0 / 0
02.10.2013, 16:02:57
    #38414524
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
cdtyjv,
использую, потому что удобно (остальные варианты длиннее).
А сортировка тут не нужна:
Код: java
1.
2.
3.
4.
Map<Integer,User> usersForClone = new HashMap<Integer,User>();
for(User user : map.keySet()){
	usersForClone.put(user.getAge(), user);
}


дальше клонируем. Максимальная сложность n*2. С массивом, наверно, можнно сэкономить какую-то константу при больших n
...
Рейтинг: 0 / 0
02.10.2013, 16:10:14
    #38414547
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Поторопился, код неправильный, не хватает проверок, но идея наверно понятна?
...
Рейтинг: 0 / 0
02.10.2013, 16:16:49
    #38414568
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
cdtyjvДа, пример не очень. Тогда классика: how much watch

Я встречал "took yes and go" (взял да и пошел).
...
Рейтинг: 0 / 0
02.10.2013, 16:20:41
    #38414575
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
ivanraПоторопился, код неправильный, не хватает проверок, но идея наверно понятна?Так там в проверках вся соль и заключается. В зависимости от того, что и как вы будете проверять, сложность будет плавать от n^2 до приблизительно n ln n.
...
Рейтинг: 0 / 0
02.10.2013, 16:23:03
    #38414580
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
ivanraиспользую, потому что удобно (остальные варианты длиннее).Тут вопрос не в удобстве, а в том, что перевод map = карта является неверным в данном контексте. Здесь map = таблица .
...
Рейтинг: 0 / 0
02.10.2013, 16:28:22
    #38414588
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
нет, просто надо в карте хранить кортежи <счетчик, пользователь>, либо использовать промежуточную карту / массив
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Map<Integer,User> distinctAges = new HashMap<Integer,User>();
Map<Integer,User> usersForClone = new HashMap<Integer,User>();
for(User user : map.keySet()){
	Integer age = user.getAge();
	if (distinctAges.containsKey(age))
		usersForClone.put(age, user);
	else
		distinctAges.put(age, user);
}           


Тут вся идея - использовать ассоциацию (возраст<->пользователь), либо фиксированный массив, проиндексированный возрастом
...
Рейтинг: 0 / 0
02.10.2013, 17:05:54
    #38414658
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Leyla89,
кстати, вот за это могут снизить оценку:
Код: java
1.
2.
3.
    if(name != other.name){
        return false;
    }
...
Рейтинг: 0 / 0
02.10.2013, 19:46:52
    #38414828
Leyla89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
ivanra, почему могут снизить оценку?
DoSOfRedRiver, в вашем коде что такое userSet? Редактор не понимает переменную даже после присваивания типа User.
Переписала:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
public class User{
	static int age = (int)(Math.random()*100);
	final int growth;
	final int weight;
	final String name;
	
	public static User newInstance(User u) { 
	    return new User(u.getName(), u.getGrowth(), u.getWeight()); 
	} 

	public User(String name, int growth, int weight){
		this.name = name;
		this.growth = growth;
		this.weight = weight;
		this.age = age;
	}
	
	public int hashCode(){
		final int prime = 31;
		int result = 1;
		result = prime * result + growth;
		result = prime * result + weight;
		return result;
	}
	
	public boolean equals(Object obj){
		if(this == obj){
			return true;}
		if(obj == null){
			return false;
		}
		if(getClass() == obj.getClass()){
			return false;
		}
		User other = (User)obj;
		if(growth != other.growth){
			return false;
		}
		if(weight != other.weight){
			return false;
		}
		if(name != other.name){
			return false;
		}
		if(age != other.age){
			return false;
		}
		return true;
	}
			
	public int getAge(){
		return age;
	}
	
	public int getGrowth(){
		return growth;
	}
	
	public int getWeight(){
		return weight;
	}
	
	public String getName(){
		return name;
	}
	
	public static void main(String[] args) {        
	    Map<User, Integer> map = new HashMap<User, Integer>();
	    User u = new User("Emily", 165, 60);
	    User u1 = new User("Emma",70, 65);
	    User u2 = new User("Michael", 180, 80);
	    User u3 = new User("Andrew", 180, 70);
	    User u4 = new User("Isabella", 158, 46);
	    User u5 = new User("John", 164, 62);
	    User u6 = new User("Samuel", 184, 83);
	    User u7 = new User("Anna", 165, 53);
	    User u8 = new User("Jasmine", 168, 60);
	    User u9 = new User("Robert", 193, 78);
	    map.put(u, 1);
	    map.put(u1, 2);
	    map.put(u2, 3);
	    map.put(u3, 4);
	    map.put(u4, 5);
	    map.put(u5, 6);
	    map.put(u6, 7);
	    map.put(u7, 8);
	    map.put(u8, 9);
	    map.put(u9, 10);
	    for(Entry<User, Integer> entry : map.entrySet()){
	        System.out.println(entry.getKey() + " " + entry.getValue());
	    }    
	}
}
...
Рейтинг: 0 / 0
02.10.2013, 22:30:17
    #38414898
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
Leyla89,

userSet это сет из объектов User.

Set<User> userSet = new HashSet<User>; //Приблизительно так объявляется.
...
Рейтинг: 0 / 0
02.10.2013, 22:40:52
    #38414903
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
this.age = age;

вот это лишнее в конструкторе, а так - прогресс налицо)
...
Рейтинг: 0 / 0
03.10.2013, 14:17:32
    #38415534
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение параметров объектов
В чём смысл этого?
Код: java
1.
static int age = (int)(Math.random()*100);
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Сравнение параметров объектов / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]