08. juli 2011 - 12:07
Der er
8 kommentarer og 1 løsning
Søge algoritme
Hej Eksperter Jeg prøver at finde en måde hvor på jeg kan forbedre søge funktionen ved et SQL kald. INFO: SQL-sætningen bliver kalder hver gang man taster et bogstav, så kan hurtig komme mange kald. Nu bruger jeg: SELECT navn FROM personer WHERE navn LIKE '%and%' Jeg tænkte om man kunne bruge noget med. Hvor rækken så bliver sorteret med de navn som indholder flest bogstaver: SELECT navn FROM personer WHERE CHARINDEX('a', navn ) > 1 OR CHARINDEX('n', navn ) > 1 OR CHARINDEX('d', navn ) > 1 Nogle der kan hjælpe med det her?
Annonceindlæg fra Partnertekst
Hvor mange rækker indeholder Personer?
Der er pt. 38.000 rækker Jeg arbejder med MS SQL 2008 og Java
Lav en klasse IdNavn med to properties Id og Navn, laes alle 38000 ind i en ArrayList<IdNavn> og soeg i den i memory.
Lige akkurat... det var netop derfor jeg spurgte efter antallet af rækker :)
Så laver jeg noget med contains og andre smarte søge ting. Har i.et.eksempel?
Kommer an på hvad du programmerer i, men eks.vis C#, så er det jo til at lave... eks.vis StartsWith, IndexOf osv. var personer = HentAllePersonnavneFraDB(); Lad os sige at personer returnere noget alá: var personer = new[] { "Tom", "Dick", "Harry", "Mary", "Jay" }; var tmp = personer.Where (n => n.StartsWith("T")); var tmp = personer.Where (n => n.IndexOf("T") >= 0); Så kan du debugge dig igennem og kigge på indholdet :)
Noget Java kode: import java.util.ArrayList; import java.util.List; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; public class FastLike { public static List<String> LoadFromDB() { // mockup // real code will do SELECT navn FROM personer List<String> res = new ArrayList<String>(); res.add("Anders And"); res.add("Joakim Von And"); res.add("Rip"); res.add("Rap"); res.add("Rup"); res.add("Andersine"); res.add("Fætter Højben"); res.add("Georg Gearløs"); return res; } public static List<String> containsFilter(List<String> input, String target) { List<String> res = new ArrayList<String>(); for(String elm : input) { if(elm.contains(target)) { res.add(elm); } } return res; } public interface ListFilter<T> { public boolean accept(T o); } public static <T> List<T> filterList(List<T> input, ListFilter<T> filter) { List<T> res = new ArrayList<T>(); for(T elm : input) { if(filter.accept(elm)) { res.add(elm); } } return res; } public static void main(String[] args) { List<String> andeby = LoadFromDB(); // manual for(String fignam : andeby) { if(fignam.contains("And")) { System.out.println(fignam); } } // specific string contains filter for(String fignam : containsFilter(andeby, "And")) { System.out.println(fignam); } // general custom filter for(String fignam : filterList(andeby, new ListFilter<String>() { public boolean accept(String o) { return o.contains("And"); } })) { System.out.println(fignam); } // Google collections for(String fignam : Collections2.filter(andeby, new Predicate<String>() { public boolean apply(String o) { return o.contains("And"); } })) { System.out.println(fignam); } } }
Det virker til jeg iikkeq kan forlange om mere. Smider du et svar arne
Computerworld tilbyder specialiserede kurser i database-management