¿Cómo escribir consultas recursivas en Java?
/u 011627980/article/details/51454323
/**?
*?Descripción del método de descripción: ¿Convertir la lista en una estructura de árbol?
*
*?@param? ¿Todos los registros?
*?@¿Volver?
*?@Hora? 10 de mayo de 2016? 18:35
*?@Autor? ¿Yangdong?
*/
¿Público? lista<record>? useListRecordToTree(List<Records>?allRrecords)? {
¿Lista<Registro>? listParentRecord? =?Nuevo? ArrayList<Record>();
Lista<Record>? listNotParentRecord? =?Nuevo? ArrayList & ltrecord& gt();
//? Paso 1: recorra allRrecords y guarde el uuid de todos los datos, que se utiliza para determinar si es el nodo raíz.
Mapa<String,? cuerda y gt? mapAllUuid? =?Nuevo? HashMap<String,? String>();
Mapa<String,? grabar>? todoRecordMap? =?Nuevo? HashMap<String,? Record>();
¿Para qué? (¿grabar?¿grabar?:?todosRrecords)? {
mapalluuid . put(record . gettr(" uuid "),?record . gettr(" uuid "));
todos recordmap . "),? registro);
}
//?Paso 2: recorra todos los registros y busque todos los nodos raíz y no raíz.
¿Y si? (allRrecords?!=?null?& amp& amp?allRrecords.size()?& gt?0)?{
¿Para qué? (¿grabar?¿grabar?:?todosRrecords)? {
¿Y si? (string util . está en blanco(record . gettr(" parent _ uuid "))
||?! mapalluuid . contiene clave(record . gettr(" parent _ uuid "))?{
listParentRecord.add(record);
}? ¿En caso contrario {
listNotParentRecord.add(record);
}
}
}
//?Paso 3: Obtener recursivamente todos los nodos secundarios
If? (listParentRecord.size()?& gt ? 0) ?{
¿Para? (¿record? record?:?listParentRecord)? {
//?Agregar todos los niños
record.set( "childs", this . gettreechildrecord(listNotParentRecord, ?record . gettr(" uuid ")));
}
}
Devolver listParentRecord
p>}
/**?
*? Descripción del método de descripción: ¿Convertir la lista en un árbol y filtrar según palabras clave y nombres de nodos?
*
¿Todos los registros?
¿Palabras clave para filtrar?
* ?@param?Campo para filtrar
*?@Hora? :27:32 pm /p>
*?@杨东?
*/
Public?list<Record>?uselisterecordtotreebykeywords(List<Record>?Todos los registros,? cadena? filterFields )? {
listRecord? =?ArrayList<Record>();
¿Qué?:?allRecords?
todo recordmap . put(record . gettr(" uuid "),? record);
}
//? Recorra allRrecords para encontrar todos los datos relacionados con el nombre del nodo y las palabras clave.
¿Y si? (allRecords?!=?null?& amp& amp?allRecords.size()?& gt?0)?{
¿Si? (filterFields.length?& gt?1)?{
¿Para qué? (¿Grabar? ¿Grabar?:?todos los registros)? {
¿Para qué? (¿Cadena? ¿Campo?:? ¿Campos de filtro)? {
//?Comparar
¿Y si? (record.getStr(campo).toLowerCase().
indexOf(palabras clave.toLowerCase())? ! =?-1)?{
listRecord.add(record);
}
}
}
}? ¿Y si? {
¿Para qué? (¿Grabar? ¿Grabar?:?todos los registros)? {
//?Comparar
¿Y si? (record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase())?!=?-1)?{
listRecord.add(record);
}
}
}
}
//?Encuentre el nodo filtrado y su nodo principal
listaRegistro? =?this.getselfthantheirparentrecord(list record,?new?ArrayList<record>(),
new?HashMap<string,?record>(),?all recordmap
//?Convertir el mapa de registros filtrado); datos en una estructura de árbol.
listaRegistro? =?this . uselistrecordtotree(lista de registros);
¿Volver? listRecord
}
/**?
*? Descripción del método de descripción: ¿Consultar recursivamente nodos secundarios?
*
*?@param? ¿Lista de niños? ¿Nodo hijo?
*?@param? padreUuid? ¿Identificación del nodo principal?
*?@¿Volver?
*?@Hora? 10 de mayo de 2016? 15:29:35
*?@Autor? ¿Yangdong?
*/
¿Privado? lista<record>? getTreeChildRecord(Lista<Registro>? ¿Lista de hijos? ¿Cadena?parentUuid)? {
¿Lista<Registro>? listParentRecord? =?Nuevo? ArrayList<Record>();
Lista<Record>? listNotParentRecord? =?Nuevo? ArrayList & ltRecord& gt();
//?Recorra tmpList y encuentre todos los nodos raíz y no raíz.
¿Y si? (childList?!=?null?& amp& amp?childList.size()?& gt?0)?{
¿Para qué? (¿Registro? ¿Registro?:?childList)? {
//?Encuentre el nodo principal mediante comparación.
¿Y si? (string util . equals(record . gettr(" parent _ uuid "), ? parentUuid))? {
listParentRecord.add(record);
} ¿De lo contrario? {
listNotParentRecord.add(record);
}
}
}
//? Consulta Nodo hijo
¿Si? (listParentRecord.size()?& gt?0)?{
¿Para qué? (¿Registro? ¿Registro?:?listParentRecord)? {
//? Consulta recursivamente nodos secundarios
record.set("childs ", getTreeChildRecord(listNotParentRecord,?record . getstr(" uuid ")));
}
}
¿Volver? listParentRecord
}
/**?
*? Descripción del método de descripción: ¿Encontrar recursivamente este nodo y su nodo principal?
*
*?@param? lista de padres? ¿Nodo principal de nodos relacionados filtrados por palabra clave?
*?@param? ¿Lista de resultados? ¿Nodo de filtro devuelto?
*?@param? filtroRecordMap? ¿Nodos filtrados?
*?@param? todoRecordMap? ¿Todos los nodos?
*?@¿Volver?
*?@Hora? 19 de mayo de 2016? 09:53:56?
*?@Autor? ¿Yangdong?
*/
¿Privado? lista<record>? getselfthantheirparentrecord(List<record>?parentList,?list<record>?resultList,
map<string,?record>?filterRecordMap,
map <String,?record>?allRecordMap)? {
//?Cuando el nodo principal está vacío o el número de nodos es 0, devuelve el resultado y sale de la recursividad.
¿Y si? (parentList?==?null?||?parentList.size()?==?0)?{
¿Regresión? Lista de resultados;
}
//?Recrear la colección de nodos principales
List & ltRecord>? listParentRecord? =?Nuevo? ArrayList & ltRecord& gt();
//?Recorre los nodos filtrados.
¿Para qué? (¿Registro? ¿Registro?:?Lista de padres)? {
¿Cadena? ¿uuido? =?record . getstr(" uuid ");
Cadena? padre_uuid? =?record . getstr(" parent _ uuid ");
//?Si los nodos filtrados no existen, se agregarán a la lista.
¿Y si? (!filterrecordmap. contiene clave(uuid))? {
listParentRecord.add(record); //?Agregar al nodo principal
filterRecordMap.put(uuid, registro //?Agregar al mapa filtrado
<); p>allrecordmap . remove(uuid); // Elimina el elemento correspondiente de la colección.resultList.add(record); //?Agregar al conjunto de resultados
}
//?Busque el nodo principal de este nodo y agréguelo. a listParentRecord colección de nodos principales y elimine el elemento correspondiente en la colección.
¿Y si? (cadena util. isnotblank(padre _ uuid))? {
¿Grabar? registro de padres? =?allrecordmap .get(parent_uuid);
¿Si? (¿parentRecord?!=?nulo)? {
listparentrecord . add(registro principal);
allrecordmap . p>
}
//? Llamada recursiva
getselfthantheirparentrecord(lista de registros principales,? lista de resultados,? filterRecordMap,? todos los mapas de registros);
¿devolver? Lista de resultados;
}
[java]? ¿Punto de vista? ¿aburrido? Copiar
//Ejemplo
[java]? ¿Punto de vista? ¿aburrido? Copiar
/**?
*?Descripción Método Descripción: ¿Consultar recursivamente todos los permisos?
*
*?@param? ¿Palabra clave?
*?@param? ¿Eliminado?
*?@¿Volver?
*?@Hora? 10 de mayo de 2016? 15:47:50
*?@Autor? ¿Yang Dong?
*/
¿Público? lista<record>? getrecordbykeyword recursivo(¿Cadena?palabra clave,?cadena?is_delete)? {
//?Paso uno: consulta todos los datos.
¿StringBuffer? SQL? =?Nuevo? String buffer(
"? ¿Seleccionar? pa.uuid, pa.parent_uuid, pa.author_code, pa.author_name, pa.is_menu, pa.sort_number, pa.is_enable, pa.menu_icon?") ;
sql.append("from?s_author?pa");
Lista<Object>? parámetros? =?Nuevo? ArrayList & ltObject & gt();
sql.append("?donde pa . está _ eliminado = ");
add(está _ eliminado
sql.append("?Orden?¿Por quién?pa.sort_number?asc?");
Lista<Record>? ¿Todos los registros? =?Db.use(AppConst.DB_DATASOURCE_MAIN). find(sql.toString(),? param util . listto array(params));
[java]? ¿Punto de vista? ¿aburrido? Copiar
//Paso 2: cambie la lista a una estructura de árbol.
¿Y si? (StringUtil.isNotBlank (palabra clave))? {
¿Volver? super .uselisterecordtotreebykeywords(todos los registros,palabras clave,?"Nombre del autor");
}?¿De lo contrario? {
¿Volver? super .uselistrecordtotree(todos los registros);
}
}