Hei,
Haluasisin etisä seuraaasa koodista halutulla stringillä:
String sort = req.getParameter("sort"); String dir = req.getParameter("dir"); String guery = req.getParameter("query"); String fields = req.getParameter("fields"); ServiceOutcome<List<Project>> so = projectService.getAllProjects(targetUser); List<Project> projectobjects = so.get(); if (projectobjects != null && projectobjects.size() > 0) { if (dir.equals("ASC")) { Collections.sort(projectobjects, new Comparator<Project>(){ public int compare(Project obj1, Project obj2) { if (obj1 == null) { return -1; } if (obj2 == null) { return 1; } if (obj1.getProjectTypeKey().getKey() == obj2.getProjectTypeKey().getKey()) { return 0; } return obj2.getProjectTypeKey().getKey().compareTo(obj1.getProjectTypeKey().getKey()); } }); } else if (dir.equals("DESC")) { Collections.sort(projectobjects, new Comparator<Project>(){ public int compare(Project obj1, Project obj2) { if (obj1 == null) { return -1; } if (obj2 == null) { return 1; } if (obj1.getProjectTypeKey().getKey() == obj2.getProjectTypeKey().getKey()) { return 0; } return obj1.getProjectTypeKey().getKey().compareTo(obj2.getProjectTypeKey().getKey()); } }); } } else { // do nothing }
Mihin kohtaan koodia olisi laitettava haku? Ja miten?
Onpa epämääräinen kysymys.
Koodista voi jotenkin päätellä, että haluat ehkä filtteröidä query-parametrin mukaan listasta jotain tietoa. Onko näin?
Silloin haku kannattaa tehdä ennen listan järjestemistä eli heti ensimmäisen if-lauseen alussa. Haku voisi mennä jotenkin tähän tapaan:
Iterator<Project> iter = projectobjects.iterator(); while (iter.hasNext()) { Project p = iter.next(); if (p.getProjectTypeKey().getKey().equals(query) == false) { iter.remove(); } }
Auttaa myös, jos kirjoitat muuttujat oikein (esim. query eikä guery).
Siis haluan, että sortaus toimii ja sitten lista siuvutaan eri sivuiksi, että dataa ei tule liikaa. Ja sitten juuri query-parametrilla haetaan esim. projektin nimen perustella siis tarkoitan filteröintiä.
int projectcount = projectobjects.size(); Pageable<List> pageable = new Pageable(projectobjects); pageable.setPageSize(limitReq); pageable.setPage(pageRange); List pagelist = pageable.getListForPage(); Iterator projects = pagelist.iterator(); //Iterator<Project> projects = projectobjects.iterator(); while (projects.hasNext()) { Project project = (Project) projects.next(); if (project.getName().equals(query) == false) { projects.remove(); }
Eli tarkemmin haluan lista vain queryn mukaiset nimet.
Tässä on nyt kokokoodi joka toimii. Mutta miten saan etsittyä projekteista niin että hakusanana on melkein sinne päin oleva stringi. Eli jos projekti vaikka alkaa kirjaimella R niin koodi listaa kaikki projektit jotka alkavat kirjaimella R, tms.
ServiceOutcome<List<Project>> so = projectService.getAllProjects(targetUser); List<Project> projectobjects = so.get(); if (projectobjects != null && projectobjects.size() > 0) { if (dir.equals("ASC")) { Collections.sort(projectobjects, new Comparator<Project>(){ public int compare(Project obj1, Project obj2) { if (obj1 == null) { return -1; } if (obj2 == null) { return 1; } if (obj1.getProjectTypeKey().getKey() == obj2.getProjectTypeKey().getKey()) { return 0; } return obj2.getProjectTypeKey().getKey().compareTo(obj1.getProjectTypeKey().getKey()); } }); } else if (dir.equals("DESC")) { Collections.sort(projectobjects, new Comparator<Project>(){ public int compare(Project obj1, Project obj2) { if (obj1 == null) { return -1; } if (obj2 == null) { return 1; } if (obj1.getProjectTypeKey().getKey() == obj2.getProjectTypeKey().getKey()) { return 0; } return obj1.getProjectTypeKey().getKey().compareTo(obj2.getProjectTypeKey().getKey()); } }); } } else { // do nothing } int projectcount = projectobjects.size(); Pageable<List> pageable = new Pageable(projectobjects); pageable.setPageSize(limitReq); pageable.setPage(pageRange); List pagelist = pageable.getListForPage(); Iterator projects = pagelist.iterator(); //Iterator<Project> projects = projectobjects.iterator(); while (projects.hasNext()) { Project project = (Project) projects.next(); if (fields != null) { if (fields.equals("[\"name\"]")) { if (project.getName().equals(query) == false) { projects.remove(); } else { ProjectTypeKey ptk = project.getProjectTypeKey(); com.atlassian.fugue.Option<ProjectType> pt = ptm.getByKey(ptk); String projectTypeString = ptk.getKey(); ProjectType projectType = pt.getOrNull(); String icon = projectType.getIcon(); ApplicationUser appuser = project.getProjectLead(); String projectlead = appuser.getDisplayName(); Avatar avatarobject = project.getAvatar(); long avatarid = avatarobject.getId(); long projectid = project.getId(); String avatar = baseurl+"/secure/projectavatar?pid="+projectid+"&avatarId="+avatarid+"&size=small"; try { JSONObject obj = new JSONObject() .put("avatar", avatar) .put("key", project.getKey()) .put("name",project.getName()) .put("type",projectTypeString+";"+icon) .put("username",projectlead) .put("gantt", project.getKey()) .put("year", project.getKey()) .put("filtered", project.getKey()) .put("nonfiltered", project.getKey()); arr.put(obj); } catch (JSONException jerr) { jerr.printStackTrace(); System.out.println("Got an JSONException: " + jerr.getCause()); } } } else if (fields.equals("[\"key\"]")) { if (project.getKey().equals(query) == false) { projects.remove(); } else { ProjectTypeKey ptk = project.getProjectTypeKey(); com.atlassian.fugue.Option<ProjectType> pt = ptm.getByKey(ptk); String projectTypeString = ptk.getKey(); ProjectType projectType = pt.getOrNull(); String icon = projectType.getIcon(); ApplicationUser appuser = project.getProjectLead(); String projectlead = appuser.getDisplayName(); Avatar avatarobject = project.getAvatar(); long avatarid = avatarobject.getId(); long projectid = project.getId(); String avatar = baseurl+"/secure/projectavatar?pid="+projectid+"&avatarId="+avatarid+"&size=small"; try { JSONObject obj = new JSONObject() .put("avatar", avatar) .put("key", project.getKey()) .put("name",project.getName()) .put("type",projectTypeString+";"+icon) .put("username",projectlead) .put("gantt", project.getKey()) .put("year", project.getKey()) .put("filtered", project.getKey()) .put("nonfiltered", project.getKey()); arr.put(obj); } catch (JSONException jerr) { jerr.printStackTrace(); System.out.println("Got an JSONException: " + jerr.getCause()); } } } else if (fields.equals("[\"username\"]")) { if (project.getProjectLead().getDisplayName().equals(query) == false) { projects.remove(); } else { ProjectTypeKey ptk = project.getProjectTypeKey(); com.atlassian.fugue.Option<ProjectType> pt = ptm.getByKey(ptk); String projectTypeString = ptk.getKey(); ProjectType projectType = pt.getOrNull(); String icon = projectType.getIcon(); ApplicationUser appuser = project.getProjectLead(); String projectlead = appuser.getDisplayName(); Avatar avatarobject = project.getAvatar(); long avatarid = avatarobject.getId(); long projectid = project.getId(); String avatar = baseurl+"/secure/projectavatar?pid="+projectid+"&avatarId="+avatarid+"&size=small"; try { JSONObject obj = new JSONObject() .put("avatar", avatar) .put("key", project.getKey()) .put("name",project.getName()) .put("type",projectTypeString+";"+icon) .put("username",projectlead) .put("gantt", project.getKey()) .put("year", project.getKey()) .put("filtered", project.getKey()) .put("nonfiltered", project.getKey()); arr.put(obj); } catch (JSONException jerr) { jerr.printStackTrace(); System.out.println("Got an JSONException: " + jerr.getCause()); } } } else { ProjectTypeKey ptk = project.getProjectTypeKey(); com.atlassian.fugue.Option<ProjectType> pt = ptm.getByKey(ptk); String projectTypeString = ptk.getKey(); ProjectType projectType = pt.getOrNull(); String icon = projectType.getIcon(); ApplicationUser appuser = project.getProjectLead(); String projectlead = appuser.getDisplayName(); Avatar avatarobject = project.getAvatar(); long avatarid = avatarobject.getId(); long projectid = project.getId(); String avatar = baseurl+"/secure/projectavatar?pid="+projectid+"&avatarId="+avatarid+"&size=small"; try { JSONObject obj = new JSONObject() .put("avatar", avatar) .put("key", project.getKey()) .put("name",project.getName()) .put("type",projectTypeString+";"+icon) .put("username",projectlead) .put("gantt", project.getKey()) .put("year", project.getKey()) .put("filtered", project.getKey()) .put("nonfiltered", project.getKey()); arr.put(obj); } catch (JSONException jerr) { jerr.printStackTrace(); System.out.println("Got an JSONException: " + jerr.getCause()); } } } else { ProjectTypeKey ptk = project.getProjectTypeKey(); com.atlassian.fugue.Option<ProjectType> pt = ptm.getByKey(ptk); String projectTypeString = ptk.getKey(); ProjectType projectType = pt.getOrNull(); String icon = projectType.getIcon(); ApplicationUser appuser = project.getProjectLead(); String projectlead = appuser.getDisplayName(); Avatar avatarobject = project.getAvatar(); long avatarid = avatarobject.getId(); long projectid = project.getId(); String avatar = baseurl+"/secure/projectavatar?pid="+projectid+"&avatarId="+avatarid+"&size=small"; try { JSONObject obj = new JSONObject() .put("avatar", avatar) .put("key", project.getKey()) .put("name",project.getName()) .put("type",projectTypeString+";"+icon) .put("username",projectlead) .put("gantt", project.getKey()) .put("year", project.getKey()) .put("filtered", project.getKey()) .put("nonfiltered", project.getKey()); arr.put(obj); } catch (JSONException jerr) { jerr.printStackTrace(); System.out.println("Got an JSONException: " + jerr.getCause()); } } }
Sitten miten kannattaisi laskea paginaatio?
nyt oli niin paljon copypastea etten jaksanut lukea loppuun. Siirrä yhtenevät koodit omiin metodeihin, sen sijaan että kopioit niitä. Toinen asia, poista magic stringit ja käytä constantteja (javassa tosin final tyyppisiä, sama asia). Koodin lukeminen helpottuu huomattavasti.
Ymmärsin että mun tarvii vain saada alla olevaan oikea rexi:
if (project.getProjectLead().getDisplayName().matches("/^"+query+"/") == false) { projects.remove(); } else { }
Eli siis että koodi katsoo alkaako .getDisplayName() -stringi esim. jollain kirjaimella.
Vosiko joku nyt kertoa mitä minun tulee laittaa kohtaan? matches("/^"+query+"/")
Valehtelit jo tuossa yllä, että tuo iso koodi-pastesi toimisi. Voit siis katsoa siitä koodista, miten se tunnistaa poistettavat tietueet, ja sen jälkeen kopioida saman toiminnallisuuden hakutulosten suotimiseen.
The Alchemist kirjoitti:
Valehtelit jo tuossa yllä, että tuo iso koodi-pastesi toimisi. Voit siis katsoa siitä koodista, miten se tunnistaa poistettavat tietueet, ja sen jälkeen kopioida saman toiminnallisuuden hakutulosten suotimiseen.
Enpäs valehdellut vaan siellä lukee ihan selkeästi, että se toimii vain jos hakuun syötettävä hakuasana on === "Projektin nimi" ja haluan siis niin että hakusanan tarvitsee alkaa projektin nimellä.
Vaivaudu lukemaan vähän tarkemmin ja ajatuksella.
Yksinkertaista: a.toLowerCase().startsWith(b.toLowerCase()). Turha tähän on mitään säännöllisiä lausekkeita sotkea.
walkout_ kirjoitti:
Vosiko joku nyt kertoa mitä minun tulee laittaa kohtaan? matches("/^"+query+"/")
Kuten Metabolix sanoi, tässä ei kannata käyttää säännöllisiä lausekkeita. Selitän tässä vain, miksi kirjoittamasi koodi ei toimi.
Javassa säännöllinen lauseke täsmää aina koko merkkijonoon kerralla. /
-merkkiä ei tarvitse alkuun tai loppuun. Eli jos haluat täsmätä vain alun, oikea lauseke olisi query+".*"
.
Regex-syntaksin erikoismerkkien pitää olla ohitettuja query-muuttujassa. Helpointa olisi kai käyttää \Q...\E
-komentoa ja ohittaa kaikki kenoviivat, minkä jälkeen lauseke näyttää tältä (lisäsin vielä (?i)
-asetuksen, jotta isoilla ja pienillä kirjaimilla ei ole väliä):
.matches("(?i)\\Q"+query.replaceAll("\\\\", "\\\\\\\\")+"\\E.*")
Tuo koodi on jo niin sekava ja pitkä, että on selkeästi parempi käyttää Metabolixin versiota.
.toLowerCase().startsWith(query.toLowerCase())
Kiitos avusta. Koodi toimii nyt paitsi jos hakuun laittaa jotain mitä ei ole tietokannassa tai jos hakuun syöttää tyhjää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.