首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java对某个范围内的用户按年龄分组

使用Java对某个范围内的用户按年龄分组
EN

Stack Overflow用户
提问于 2013-11-27 02:39:22
回答 4查看 3.8K关注 0票数 1

我有一个具有不同年龄的1,000,000个用户列表,我想在Java中执行一个搜索,它将根据年龄范围输出组中的人数。例如:

代码语言:javascript
运行
复制
Age Group                 Age Range
1                         6 years old or younger
2                         7 to 18 years old
3                         19 to 26 years old
4                         27 to 49 years old
5                         50 to 64 years old
6                         65 to 79 years old
7                         80 years old or older

如果我输入一个特定的年龄组,我希望我的输出显示属于该年龄组的人数。这就是:

代码语言:javascript
运行
复制
If I enter 1

输出应为:

代码语言:javascript
运行
复制
**** users found (total number of users that falls within the 
age range 6 years old or younger)

任何类型的数据结构都是完全可以的。

这就是我到目前为止所做的:

代码语言:javascript
运行
复制
 /**
 A template used to read data lines into java.util.ArrayList data structure.
 Input file: pjData.csv
 Input file must be saved under the same directory/folder as the program.
 Each line contains 5 fields, separated by commas. For example,
 959695171, 64, AZ, M, 1
 355480298, 101, TN, F, 1
 **/
 import java.io.*;
 import java.util.*;
 public class pj3Template2
 {
  public static void main(String args[]) 
 {
String line;
String id, s, g;
Integer a, sa;
StringTokenizer st;
HealthDS2 records = new HealthDS2(); 
try   {
      FileReader f = new FileReader("pjData.csv");
      BufferedReader in = new BufferedReader(f);
      while ((line = in.readLine()) != null)
         {
         st = new StringTokenizer(line, ",");
         id = st.nextToken(",").trim();
         a = Integer.valueOf(st.nextToken(",").trim());
         s = st.nextToken(",").trim().toUpperCase();
         g = st.nextToken(",").trim().toUpperCase();
         sa = Integer.valueOf(st.nextToken().trim());
         records.add(new HealthRec2(id, a, s, g, sa));
         } // loop until the end of file
      in.close(); 
      f.close();
      }
      catch (Exception e) {  e.printStackTrace(); };
System.out.println(records.getSize() + " records processed.");

 // Search by age
System.out.print("Enter 1-character age abbreviation to search: ");
String ui;
Scanner input = new Scanner(System.in);
ui = input.next().trim();
System.out.println("Searching all records in: " + ui);

ArrayList <HealthRec2> al = records.searchByAge(Integer.valueOf(ui.trim()));
System.out.println(al.size() + " records found.");    

     }
 }

 /**
 Data class Sample records:
 5501986, 31, WV, F, 1
 1539057187, 5, UT, M, 2
 **/
 class HealthRec2
 {
    String ID;
    Integer age;
    String state;
    String gender;
    int status;
    public HealthRec2() { }
    public HealthRec2(String i, Integer a, String s, String g, int sa)
       { ID = i; age = a;  state = s; gender = g; status = sa; }
 // Reader methods
 public String getID()     { return ID; }
 public Integer getAge()   { return age; }
 public String getState()  { return state; }
 public String getGender() { return gender; }
 public int getStatus()    { return status; }
 // Writer methods
 public void setAge(Integer a)   { age = a; }
 public void setState(String s)  { state = s; }
 public void setGender(String g) { gender = g; }
 public void setStatus(int sa)   { status = sa; }

 public String toString()
 { return ID + "  " + age + "  " + state + "   " + gender + "  " + status; }
 } // HealthRec


 // Data structure used to implement the requirement
 // This implementation uses java.util.ArrayList
 class HealthDS2
 {
 ArrayList <HealthRec2> rec;
 public HealthDS2() 
  { rec = new ArrayList <HealthRec2>(); }
 public HealthDS2(HealthRec2 r) 
 { 
 rec = new ArrayList <HealthRec2>();
 rec.add(r); 
 }
 public int getSize() { return rec.size(); }
 public void add(HealthRec2 r) { rec.add(r); }

// Search by age
// No data validation is needed -- assuming the 1-character age is valid
// Returns an ArrayList of records
public ArrayList <HealthRec2> searchByAge(Integer a)
{
ArrayList <HealthRec2> temp = new ArrayList <HealthRec2>();
  for (int k=0; k < rec.size(); ++k)
  {
  if (rec.get(k).getAge().equals(a))
     temp.add(rec.get(k));  
  }
  return temp;
  } // searchByAge
  } // HealthDS

我的目标是基于statestatusgenderage组进行搜索。我已经为其他人这样做了,但我只是在年龄组上遇到了一点问题,因为它是分组的,而不仅仅是在数据文件中搜索特定的年龄。我试着为每个组创建了七个数组列表,但在组之间切换仍然有一些问题。

EN

回答 4

Stack Overflow用户

发布于 2013-11-27 03:07:31

此代码执行以下操作:

  1. 获取所选组的最小和最大年龄
  2. 迭代这些年龄,并为最小/最大年龄内的任何年龄递增计数器
  3. 打印出结果

对于非常大的数据集,你需要使用更好的数据结构,比如@kyticka提到的。

代码语言:javascript
运行
复制
public static void main (String[] args) throws java.lang.Exception
    {
        int[] groupMin = new int[]{0, 10, 20};
        int[] groupMax = new int[]{10, 20, 9999};

        int[] ages = new int[]{ 1, 2, 3, 10, 12, 76, 56, 89 };

        int targetGroup = 1;
        int count = 0;
        for( int age : ages ){
            if( age >= groupMin[targetGroup] && age < groupMax[targetGroup] ){
                count++;
            }
        }

        System.out.println("Group " + targetGroup + " range is " + 
                        groupMin[targetGroup] + " - " + groupMax[targetGroup]);
        System.out.println("Count: " + count);
    }

你可以在这里使用它:http://ideone.com/DAWGYX

票数 0
EN

Stack Overflow用户

发布于 2013-11-27 03:49:51

你可以使用一些方法来初始化你的1000000个用户,或者甚至下面的代码都会为用户生成随机的年龄:

代码语言:javascript
运行
复制
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class UserListDemo {
    int age;
    class Users{
        int age=0;
        public Users(int a)
        {
            age=a;
        }
        public void setAge(int age)
        {
            this.age=age;
        }
        public int getAge()
        {
            return this.age;
        }
    }

    public static void main(String a[])
    {
        UserListDemo uld=new UserListDemo();
        ArrayList<Users> data=new ArrayList<Users>();
        uld.initializeUsers(data);
        System.out.println("Enter age group choice"); 
        System.out.println("Enter 1 for age group 1-6");
        System.out.println("Enter 2 for age group 7-18");
        System.out.println("Enter 3 for age group 19-26");
        System.out.println("Enter 4 for age group 27-49");
        System.out.println("Enter 5 for age group 50-64");
        System.out.println("Enter 6 for age group 65-79");
        System.out.println("Enter 7 for age group 80-Older");
        Scanner sc=new Scanner(System.in);
        String choice=sc.nextLine();
        int ch=Integer.valueOf(choice);
        long result=0;
        switch(ch)
        {
        case 1:
            for(Users us:data)
            {
                if(us.age<=6)
                    result++;
            }

        case 2:
            for(Users us:data)
            {
                if( us.age>=7 && us.age<=18 )
                    result++;
            }
        case 3:
            for(Users us:data)
            {
                if( us.age>=19 && us.age<=26 )
                    result++;
            }
        case 4:
            for(Users us:data)
            {
                if( us.age>=27 && us.age<=49 )
                    result++;
            }
        case 5:
            for(Users us:data)
            {
                if( us.age>=50 && us.age<=64 )
                    result++;
            }
        case 6:
            for(Users us:data)
            {
                if( us.age>=65 && us.age<=79 )
                    result++;
            }
        case 7:
            for(Users us:data)
            {
                if( us.age>=80)
                    result++;
            }


        }
        System.out.println("For the entered age group :"+ch+" ::"+result+" user has been found");


    }
    public void initializeUsers(ArrayList<Users> data)
    {
        Users us;
        Random rand=new Random();
        for(long l=0;l<1000000L;l++)
        {
            us=new Users(rand.nextInt(100));    
            data.add(us);
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-09 16:46:07

有一百万条记录的有效答案是使用几个Map作为索引,甚至是一个实际的数据库。但是,由于练习中明确提到了ArrayLists,您可能还在学习基础知识,所以我将继续学习这些基础知识。

首先,您需要能够检索给定人员的组。您可以通过两种方式来完成此操作。

  • Option A用于在初始化时将组添加为字段

//在HealthRec2 int组内;//将组号存储为私有静态最终int[] ageGroups = //每个组的年龄限制新int[]{6,18,26,49,64,79};私有空updateGroup() { // <--从构造函数和setAge() int currentGroup =0调用;for (int limit : ageGroups) { currentGroup ++;//如果(age <= limit)中断,则前进到下一组;//一旦达到一个{ group = currentGroup;} private int getGroup() { return group;}

  • Option B将对每条记录进行动态计算,而不是将其存储为属性:

//在私有静态最终int[] ageGroups = //每个组的年龄限制新的int[]{6,18,26,49,64,79};公共的int getGroup() { int currentGroup = 0;for (int limit : ageGroups) { currentGroup ++;//如果(age <= limit)突破,则前进到下一组;//一旦达到1}int[] currentGroup;}就停止查看限制

无论使用哪种方法,您现在都可以使用非常类似的逻辑来查找给定年龄组中的人,因为您必须查找给定州或给定性别的记录。

选项A预先更昂贵,因为即使您不需要年龄组,您仍然必须计算它并将其存储在属性中,以防万一。如果您需要为同一记录多次调用getGroup,则选项B的开销会更大-因为选项A的getGroup要快得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20225257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档