Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Java: Etsiminen List<Object>

Sivun loppuun

walkout_ [13.07.2017 16:43:38]

#

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?

Metabolix [13.07.2017 17:45:31]

#

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).

walkout_ [13.07.2017 17:51:19]

#

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.

walkout_ [13.07.2017 20:56:05]

#

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?

groovyb [14.07.2017 03:40:48]

#

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.

walkout_ [14.07.2017 03:49:55]

#

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.

walkout_ [18.07.2017 06:08:24]

#

Vosiko joku nyt kertoa mitä minun tulee laittaa kohtaan? matches("/^"+query+"/")

The Alchemist [18.07.2017 08:21:57]

#

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.

walkout_ [18.07.2017 12:58:31]

#

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.

Metabolix [18.07.2017 22:11:53]

#

Yksinkertaista: a.toLowerCase().startsWith(b.toLowerCase()). Turha tähän on mitään säännöllisiä lausekkeita sotkea.

fergusq [18.07.2017 23:37:51]

#

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())

walkout_ [19.07.2017 09:52:10]

#

Kiitos avusta. Koodi toimii nyt paitsi jos hakuun laittaa jotain mitä ei ole tietokannassa tai jos hakuun syöttää tyhjää.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta