我需要你的建议。
我在DB中有一百万行(只是F.name)我将它保存在ArrayList中。 接下来我需要用正则表达式对它进行排序。但它需要很多时间。我怎样才能让它更快?重要提示:我只需要使用java工具。谢谢你的帮助!
这是我的控制器
@RequestMapping(value = "/contacts", params = "nameFilter")
@ResponseBody
public ContactBean contacts(@RequestParam("nameFilter") String nameFilter) {
filter.setPattern(nameFilter);
long totalCount = contactDao.count();
if (totalCount <= MAX) {
return filter.filterAll();
} else {
return filter.startFilter(0, MAX);
}
}
@RequestMapping( value = "/contacts", params = {"nameFilter", "page"})
@ResponseBody
public ContactBean contacts(@RequestParam("nameFilter") String nameFilter,
@RequestParam("page") int page,
@RequestParam(value = "cnt", required = false, defaultValue = "1000000") int cntPerPage) {
filter.setPattern(nameFilter);
if (page < 0) {
page = 0;
}
if (cntPerPage > MAX || cntPerPage < 1) {
cntPerPage = MAX;
}
return filter.startFilter(page, cntPerPage);
}
}
这是我的过滤器
@Component("filterService")
@Scope("prototype")
public class Filter {
private List<ContactEntity> result = new ArrayList<>();
private static final Logger LOGGER = LoggerFactory.getLogger(Filter.class);
@Autowired
private ContactDao contactDao;
private Pattern pattern;
public void setPattern(String regex) {
pattern = Pattern.compile(regex);
}
public Pattern getPattern() {
return pattern;
}
private void filterIt(Iterator<ContactEntity> toFilter) {
while(toFilter.hasNext()) {
ContactEntity next = toFilter.next();
if(!pattern.matcher(next.getName()).matches()) {
result.add(next);
}
}
}
public ContactBean filterAll() {
LOGGER.info("Start filtering for all data");
List<ContactEntity> contacts = (List<ContactEntity>)contactDao.findAll();
filterIt(contacts.iterator());
ContactBean model = new ContactBean();
model.setContacts(result);
model.setTotalCount(contactDao.count());
LOGGER.info("Filtering complete");
return model;
}
public ContactBean startFilter(int startPage, int cntPerPage) {
LOGGER.info("Start filtering");
Page<ContactEntity> contacts = contactDao.findAll(new PageRequest(startPage, cntPerPage, Sort.Direction.ASC, "id"));
filterIt(contacts.iterator());
ContactBean model = new ContactBean();
model.setContacts(result);
model.setTotalCount(contactDao.count());
model.setCurrentPage(startPage);
model.setTotalPage(contacts.getTotalPages());
LOGGER.info("Filtering complete");
return model;
}
}