Collections ArrayList Object - Attribut von dem Object vergleichen

Ollek

Bekanntes Mitglied
Hallo,

ich möchte überprüfen, ob es einen Film schon in der ArrayList gibt. Diese möchte ich anhand der ID, dieses Film machen. Ich habe eine ArrayList von dem Object MovieDataObj. Diese Object beinhaltet die Daten zu den Filmen. Jetzt möchte ich überprüfen, ob ich schon ein Object mit der gleichen ID eingetragen habe..

Habe schon einiges ausprobiert.

mit contains, equals.. Aber ich komm nicht weiter, wie kann ich auf die ID in dem Object zugreifen?
Weil wenn ich schreibe !results.contains(iOfdbID), dann zeigt er mir trotzdem die Doppelten Filme in der Suchanzeige an, dabei sollte er diese doch filtern. Das gleiche habe ich auch mit Equals gemacht...
Dann habe ichs mal richtig kompliziert probiert mit !results.iterator().next().getId().contains(iOfdbID)).
Allerdings hat er dort immer nur die ID von dem ersten eingetragenen Film gehabt udn deswegen auch alle in der ArrayList gespeichert... Ich hoffe ihr könnt mir weiter helfen 🙂

Erstmal der Quellcode:

Das MovieDataObj
Java:
public class MovieDataObj {
	
	private String film_id;
	private String filmtitel;
	private String image;
	private String year;
	private String inhalt_id;
	private String suchkriterium;
	private String titel_anzeige;
	private String org_titel;
	private String imdbID;
//	private ArrayList<MovieDataObj> arrlist_movies;
	
	public MovieDataObj(){
		film_id = "";
		filmtitel = "";
		image = "";
		year = "";
		inhalt_id = "";
		suchkriterium = "";
		titel_anzeige = "";
		org_titel = "";
		imdbID = "";
	}

	public String getId() {
		return film_id;
	}

	public void setId(String str_id) {
		this.film_id = str_id;
	}

	public String getFilmtitel() {
		return filmtitel;
	}

	public void setFilmtitel(String str_titel) {
		this.filmtitel = str_titel;
	}

	public String getImage() {
		return image;
	}

	public void setImage(String str_img) {
		this.image = str_img;
	}

	public String getYear() {
		return year;
	}

	public void setYear(String str_year) {
		this.year = str_year;
	}


	public void setInhaltid(String str_inhaltid) {
		this.inhalt_id = str_inhaltid;
	}

	public String getInhaltid() {
		return inhalt_id;
	}

	public void setSuchkriterium(String suchkriterium) {
		this.suchkriterium = suchkriterium;
	}

	public String getSuchkriterium() {
		return suchkriterium;
	}

	public void setTitel_anzeige(String titel_anzeige) {
		this.titel_anzeige = titel_anzeige;
	}

	public String getTitel_anzeige() {
		return titel_anzeige;
	}

	public void setOrg_titel(String org_titel) {
		this.org_titel = org_titel;
	}

	public String getOrg_titel() {
		return org_titel;
	}

	public void setImdbID(String imdbID) {
		this.imdbID = imdbID;
	}

	public String getImdbID() {
		return imdbID;
	}

Klasse wo der vergleich stattfinden soll:
Java:
public ArrayList<MovieDataObj> findMovieData(){
		
		ArrayList<MovieDataObj> results = new ArrayList<MovieDataObj>();
		setFullsite(TextFactory.del_next_match(getFullsite(), "Titel:"));

		int i = 0;
		if(TextFactory.checknextpos(getFullsite(), config.getStr_search_film_match(),"</table>")){
			while(TextFactory.checknextpos(getFullsite(), config.getStr_search_film_match(),"</table>") && i < 50){
				
				MovieDataObj mdO = new MovieDataObj();
				
				setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_film_match()));	
				// ID 
				String iOfdbID = getFullsite().substring(0, getFullsite().indexOf(","));
//					mdO.setId(getFullsite().substring(0, getFullsite().indexOf(",")));
					mdO.setId(iOfdbID);
					setFullsite(TextFactory.del_next_match(getFullsite(), ","));
					// Titel
					mdO.setFilmtitel(getFullsite().substring(0, getFullsite().indexOf("\"")));
					setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_img_match()));
					// Bild_Link
					mdO.setImage(config.getStr_pic_site() + getFullsite().substring(0, getFullsite().indexOf("&quot;")));
					setFullsite(TextFactory.del_next_match(getFullsite(), "\">" ));
					// Titel für Anzeige
					mdO.setTitel_anzeige(getFullsite().substring(0, getFullsite().indexOf("<font")));
					setFullsite(TextFactory.del_next_match(getFullsite(), "/"));
					// Original Titel				
					mdO.setOrg_titel(getFullsite().substring(0, getFullsite().indexOf("</font>")).trim());
					setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_year_match()));
					// Jahr
					mdO.setYear(getFullsite().substring(0, getFullsite().indexOf(")")));
					
					if(results.contains(iOfdbID)){
						results.add(mdO);
						i++;
					}else
						System.out.println("Doppelte ID: " + iOfdbID);
			}	
		}else{
			int returns = JOptionPane.showConfirmDialog(null, "Ihre Suchanfrage ergab keine Ergebnisse!\n Möchten Sie einen Film manuell hinzufügen?", "Kein Ergebniss", JOptionPane.YES_NO_OPTION);
			System.out.println(returns);
		}	
		return results;
	}


Viele Grüße
 
normal sollte es mit equals funktionieren!

Was mir als erstes in den Sinn kam: Bist du die ArrayList auch mit einer Schleife durchgegangen und hast immer die ID mit dem Index der Schleife gewählt ?

Gruß Swoop
 
Dann habe ichs mal richtig kompliziert probiert mit !results.iterator().next().getId().contains(iOfdbID)).

Joah ist schon die richtige Richtung, allerdings musst du das eben in einer Schleife machen ala
Java:
		for (Iterator<MovieDataObj> iterator = results.iterator(); iterator.hasNext();) {
			MovieDataObj obj = iterator.next();
			if(obj.getId().equals(iOfdbID)){
				//ist vorhanden....
			}
		}
 
wenn du eine liste vom Typ MovieDataObj hast und contains über die ID machst, dann klappt das definitiv nicht, da du MovieDataObj mit String vergleichst und das immer falsch ist.

Du kannst immer du gleiches mit gleichem Vergleichen. Also entweder musst du über alle deine Filme in der liste iterieren und dann per filmInListe.getId().equals(currentID) überprüfen, oder du kannst auch eine Map nutzen mit der ID als key und dem Film als Value.
 
Ich würd hashCode und equals überschreiben, die nur die id heranzieht.
Dann einfach ein neues MovieDataObj Objekt mit der zu suchenden id machen und mit contains suchen...

Oder
einfach drüber iterieren und den wert überprüfen..


if(results.contains(iOfdbID)){
dürfte doch gar nicht gehen... dü schaust ob in einer Liste mit MovieDataObj ob ein gewisser String drinnen ist...
 
Joah ist schon die richtige Richtung, allerdings musst du das eben in einer Schleife machen ala
Java:
		for (Iterator<MovieDataObj> iterator = results.iterator(); iterator.hasNext();) {
			MovieDataObj obj = iterator.next();
			if(obj.getId().equals(iOfdbID)){
				//ist vorhanden....
			}
		}

habe mich jetzt für diesen Weg entschieden...
Allerdings bekomme ich eine

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException

Wieso das? Ich verändere doch nix an der Liste...
 
Keine Ahnung wegen der Exception, aber Iteratoren sind ziemlich "out" (zumindest sollte man sie soweit wie möglich vermeiden):

Java:
for (MovieDataObj obj  : results) {
    if(obj.getId().equals(iOfdbID)){
           //ist vorhanden....
    }
}
 
Keine Ahnung wegen der Exception, aber Iteratoren sind ziemlich "out" (zumindest sollte man sie soweit wie möglich vermeiden):

Java:
for (MovieDataObj obj  : results) {
    if(obj.getId().equals(iOfdbID)){
           //ist vorhanden....
    }
}

Habs hinbekommen.... Folgende Lösung:
Durchlaufe die aktuellen Results in einer ArrayList, setze dann true oder false(je nach dem, ob der film vorhanden ist oder nicht). Dann füge ich ihm am ende des else Blocks hinzu oder lasse es, je nach dem ob isExisting auf true oder false steht 🙂.

Ist das sauber gelöst? Würde mich über eine kurze bewertung freuen 🙂

Java:
public ArrayList<MovieDataObj> findMovieData(){
		
		ArrayList<MovieDataObj> results = new ArrayList<MovieDataObj>();
		setFullsite(TextFactory.del_next_match(getFullsite(), "Titel:"));

		int iNumberOfMovies = 0;
		
		if(TextFactory.checknextpos(getFullsite(), config.getStr_search_film_match(),"</table>")){
			while(TextFactory.checknextpos(getFullsite(), config.getStr_search_film_match(),"</table>") && iNumberOfMovies < 50){
				
				MovieDataObj mdO = new MovieDataObj();
				
				setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_film_match()));	
				// ID 
				String iOfdbID = getFullsite().substring(0, getFullsite().indexOf(","));

				if(results.isEmpty()){
					mdO.setId(iOfdbID);
					setFullsite(TextFactory.del_next_match(getFullsite(), ","));
					// Titel
					mdO.setFilmtitel(getFullsite().substring(0, getFullsite().indexOf("\"")));
					setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_img_match()));
					// Bild_Link
					mdO.setImage(config.getStr_pic_site() + getFullsite().substring(0, getFullsite().indexOf("&quot;")));
					setFullsite(TextFactory.del_next_match(getFullsite(), "\">" ));
					// Titel für Anzeige
					mdO.setTitel_anzeige(getFullsite().substring(0, getFullsite().indexOf("<font")));
					setFullsite(TextFactory.del_next_match(getFullsite(), "/"));
					// Original Titel				
					mdO.setOrg_titel(getFullsite().substring(0, getFullsite().indexOf("</font>")).trim());
					setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_year_match()));
					// Jahr
					mdO.setYear(getFullsite().substring(0, getFullsite().indexOf(")")));
					
					results.add(mdO);
					iNumberOfMovies++;
				}else{
					int iResultsSize = results.size();
					boolean isExisting = false;
					for(int index = 0; index < iResultsSize; index++){
						if(results.get(index).getId().equals(iOfdbID)){
							isExisting = true;
						}
					}
					if(!isExisting){
						mdO.setId(iOfdbID);
						setFullsite(TextFactory.del_next_match(getFullsite(), ","));
						// Titel
						mdO.setFilmtitel(getFullsite().substring(0, getFullsite().indexOf("\"")));
						setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_img_match()));
						// Bild_Link
						mdO.setImage(config.getStr_pic_site() + getFullsite().substring(0, getFullsite().indexOf("&quot;")));
						setFullsite(TextFactory.del_next_match(getFullsite(), "\">" ));
						// Titel für Anzeige
						mdO.setTitel_anzeige(getFullsite().substring(0, getFullsite().indexOf("<font")));
						setFullsite(TextFactory.del_next_match(getFullsite(), "/"));
						// Original Titel				
						mdO.setOrg_titel(getFullsite().substring(0, getFullsite().indexOf("</font>")).trim());
						setFullsite(TextFactory.del_next_match(getFullsite(), config.getStr_search_year_match()));
						// Jahr
						mdO.setYear(getFullsite().substring(0, getFullsite().indexOf(")")));
						
						results.add(mdO);
						iResultsSize++;
						iNumberOfMovies++;	
					}
						
				}
			}	
		}else{
			int returns = JOptionPane.showConfirmDialog(null, "Ihre Suchanfrage ergab keine Ergebnisse!\n Möchten Sie einen Film manuell hinzufügen?", "Kein Ergebniss", JOptionPane.YES_NO_OPTION);
		}	
		//Sortiert die ArrayList
		Collections.sort(results);
		
		return results;
	}
 

Neue Themen


Zurück
Oben