我用Java编写了下面的代码,条件如下:
Name和Age。可以随机生成雇员的姓名和年龄(如果他们的姓名和年龄相同,则不需要使其名称相等。H 111,目的是比较这两个列表并返回出现在这两个列表中的雇员实例。H 212F 213
我不知道我的方法是正确的,我也不知道如何改进我的代码(我的意思是我想让它变得专业)。请帮助我纠正我的方法,使其专业化。提前谢谢你。
这是给雇员班的:
public class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}主要的课程是:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Main {
public static Employee employee;
public static void main(String[] args) {
List<Employee> list_1 = nameList(100);
List<Employee> list_2 = nameList(100);
for(int i =0; i<list_1.size(); i++) {
for(int j =0; j<list_1.size(); j++) {
if (list_1.get(i).getName().equals(list_2.get(j).getName()) &&
list_1.get(i).getAge() == list_2.get(j).getAge()) {
System.out.println("first employee name: " + list_1.get(i).getName() + " first employee age " + list_1.get(i).getAge() + " second employee name: " +
list_2.get(j).getName() + " second employee age: " + list_2.get(j).getAge());
}
}
}
}
public static List<Employee> nameList(int size) {
List<String> nameList = new ArrayList<>();
List<Integer> ageList = new ArrayList<>();
List<Employee> employeeList = new ArrayList<>();
Random randomNumberGenerator = new Random();
String[] randomName = new String[size];
for(int i = 0; i <randomName.length; i++) {
char[] name = new char[randomNumberGenerator.nextInt(5-2)+3];
for(int j = 0; j < name.length; j++) {
name[j] = (char)('a' + randomNumberGenerator.nextInt(26));
}
randomName[i] = new String(name);
nameList.add(randomName[i] );
int sss = randomNumberGenerator.nextInt(20-10) + 12;
ageList.add(sss);
}
for (int i = 0; i < 100; i++) {
employee = new Employee(nameList.get(i),ageList.get(i));
employeeList.add(employee);
}
return employeeList;
}
}发布于 2020-10-03 22:34:59
下面是一个如何将两个“列表”相交的例子。您真正想要做的是使用Set对象而不是List对象。这将提高代码的效率,但有更大的理由使用Sets而不是列表。我假设您想要创建两个列表,其中真正包含100个独特的项目,对吗?如果使用列表,您将不可避免地在两个100名员工的列表中获得副本。这在集合中是不可能发生的,因为集合中的项必须是唯一的。如果您生成100个随机的Employee对象并将它们放在一个集合中,那么您的集合中的雇员将少于100人。但这是可以解决的。
在这两个列表中生成员工列表的实际神奇之处是retainAll方法。这可以在集合和列表上调用,因此如果您碰巧已经创建了两个列表,那么您可以对其中一个列表调用retainAll,传递另一个列表,然后调用的列表将只包含两个列表中共有的员工。这就是您的直接question...use retainAll的答案!
为了让Set魔术发生,我们必须在Employee对象中实现equals和hashCode方法。为了使retainAll方法正常工作,我们也必须使用List来完成这个任务。
为了创建这两个列表/集,而不是迭代100次,我们尽可能多地迭代,直到我们在每个集合中创建了100个唯一的员工,方法是不断检查集合的size()。
下面是一个使用集合的完整示例:
package com.inlet.ifserver;
import java.util.*;
import java.util.Random;
public class Test {
static class Employee {
private final String name;
private final int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean equals(Object obj) {
if (!(obj instanceof Employee))
return false;
return name.equals(((Employee)obj).name) && age == ((Employee)obj).age;
}
public int hashCode() {
return (name + age).hashCode();
}
}
private static final Random random = new Random();
private static final String[] names = {"Jim", "Jack", "Sam", "Mary", "Kathy", "Sue", "Steve"};
public static Set<Employee> nameSet(int size) {
Set<Employee> employeeSet = new HashSet<>();
while(employeeSet.size() < size) {
String name = names[random.nextInt(names.length)];
int age = 12 + random.nextInt(40);
Employee employee = new Employee(name, age);
employeeSet.add(employee);
}
return employeeSet;
}
public static void main(String[] args) {
Set<Employee> set1 = nameSet(100);
Set<Employee> set2 = nameSet(100);
set1.retainAll(set2);
for (Employee emp: set1)
System.out.printf("%-6s %2d\n", emp.name, emp.age);
System.out.printf("Count: %d\n", set1.size());
}
}抽样结果:
Sue 34
Sue 40
Sam 51
Steve 48
Sue 48
Kathy 22
Steve 16
Jack 28
Mary 44
Jack 26
Sue 15
Kathy 28
Sue 27
Kathy 32
Mary 31
Jack 39
Jack 40
Kathy 42
Jim 31
Mary 22
Jim 34
Sam 16
Kathy 50
Jim 43
Jim 45
Sam 42
Jim 15
Jim 16
Sam 35
Sam 31
Count: 30https://stackoverflow.com/questions/64188608
复制相似问题