我有一个拥有不同年龄的1,000,000个用户列表,我想在Java中执行一次搜索,根据年龄范围只输出组中的人数。 例如:按用户年龄划分使用Java的范围
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
我希望我的输出显示,如果我进入特定年龄组的组内跌倒的人数。那就是:
If I enter 1
输出应该是:
**** users found (total number of users that falls within the
age range 6 years old or younger)
任何类型的数据结构是完全确定。
这是我迄今所做的:
/**
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
我的目标是要根据state
,status
,gender
和age
组。我已经为其他人完成了这个工作,但是由于它是分组的,而不是仅仅在数据文件中搜索特定的年龄段,所以我只是在年龄段中遇到了一些问题。我试图为每个组创建七个数组列表,但是我仍然在切换组之间存在一些问题。
问题是什么? – Compass
如果你愿意编写一个自定义比较器,我怀疑其中一个TreeSet.subSet方法会做你想做的。 – VGR