


Exemple de code pour créer un menu arborescent (y compris un menu à plusieurs niveaux) en Java
Cet article présente principalement l'exemple de code pour créer un menu arborescent en Java (prenant en charge les menus multi-niveaux). Il est très bon et a une valeur de référence. Les amis dans le besoin peuvent s'y référer
Rendu : prend en charge. menu de menus à plusieurs niveaux.
Classe d'entité de menu :
public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> children; // ... 省去getter和setter方法以及toString方法 }
Les menus doivent généralement être triés en fonction du champ d'ordre du menu :
<🎜. >/* * 排序,根据order排序 */ public Comparator<Menu> order(){ Comparator<Menu> comparator = new Comparator<Menu>() { @Override public int compare(Menu o1, Menu o2) { if(o1.getOrder() != o2.getOrder()){ return o1.getOrder() - o2.getOrder(); } return 0; } }; return comparator; }Méthode pour générer l'arborescence :
public Map<String,Object> findTree(){ Map<String,Object> data = new HashMap<String,Object>(); try {//查询所有菜单 List<Menu> allMenu = menuDao.findTree(); //根节点 List<Menu> rootMenu = new ArrayList<Menu>(); for (Menu nav : allMenu) { if(nav.getParentId().equals("0")){//父节点是0的,为根节点。 rootMenu.add(nav); } } /* 根据Menu类的order排序 */ Collections.sort(rootMenu, order()); //为根菜单设置子菜单,getClild是递归调用的 for (Menu nav : rootMenu) { /* 获取根节点下的所有子节点 使用getChild方法*/ List<Menu> childList = getChild(nav.getId(), allMenu); nav.setChildren(childList);//给根节点设置子节点 } /** * 输出构建好的菜单数据。 * */ data.put("success", "true"); data.put("list", rootMenu); return data; } catch (Exception e) { data.put("success", "false"); data.put("list", new ArrayList()); return data; } }Obtenir le sous-menu :
/** * 获取子节点 * @param id 父节点id * @param allMenu 所有菜单列表 * @return 每个根节点下,所有子菜单列表 */ public List<Menu> getChild(String id,List<Menu> allMenu){ //子菜单 List<Menu> childList = new ArrayList<Menu>(); for (Menu nav : allMenu) { // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较 //相等说明:为该根节点的子节点。 if(nav.ParentId().equals(id)){ childList.add(nav); } } //递归 for (Menu nav : childList) { nav.setChildren(getChild(nav.getId(), allMenu)); } Collections.sort(childList,order());//排序 //如果节点下没有子节点,返回一个空List(递归退出) if(childList.size() == 0){ return new ArrayList<Menu>(); } return childList; }La chaîne JSON finale renvoyée est la suivante :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

TestThepdfinanotherApptodetermineIftheissueiswiththefileoredge.2.EnBlEthebuilt-inpdfViewerByTurningOff "AlwaysOpenpdffilesexternal" et "DownloadPdffiles" inedgestoSolver.

Exécutez le processus enfant à l'aide du package OS / EXEC, créez la commande via exec.command mais ne l'exécutez pas immédiatement; 2. Exécutez la commande avec .output () et attrapez stdout. Si le code de sortie est non nul, return exec.exiterror; 3. Utilisez .Start () Pour démarrer le processus sans blocage, combinez avec .StoutPipe () pour diffuser la sortie en temps réel; 4. Entrez les données dans le processus via .stDinpipe (), et après avoir écrit, vous devez fermer le pipeline et appeler .wait () pour attendre la fin; 5. exec.exiterror doit être traité pour obtenir le code de sortie et le stderr de la commande raté pour éviter les processus zombies.

Pour optimiser les boucles de Foreach imbriquées, les itérations redondantes doivent être évitées en premier et la complexité temporelle peut être réduite de O (n × m) à O (n m); Deuxièmement, si la structure n'est pas vraiment hiérarchique, les données doivent être aplaties à l'aide de méthodes telles que SelectMany; Troisièmement, sautez à l'avance ou sautez un traitement inutile par jugement conditionnel; Quatrièmement, sélectionnez les structures de données appropriées telles que les ensembles de dictionnaire ou de hachage pour améliorer l'efficacité de la recherche; Cinquièmement, la parallélisation peut être utilisée avec prudence lorsque les opérations sont indépendantes et prennent du temps; Sixièmement, extraire la logique complexe dans des méthodes ou des requêtes indépendantes pour améliorer la lisibilité et la maintenabilité. Le cœur de l'optimisation est de réduire la complexité, d'organiser raisonnablement les données et d'évaluer toujours la nécessité de nicher, en fin de compte de code efficace, clair et extensible.

Application Java conteneurisée: Créez un DockerFile, utilisez une image de base telle que Eclipse-Temurin: 17-Jre-Alpine, copiez le fichier JAR et définissez la commande de démarrage, construisez l'image via DockerBuild et exécutez localement avec Dockerrun. 2. Poussez l'image vers le registre des conteneurs: utilisez Docktag pour marquer l'image et le pousser vers DockerHub et d'autres registres. Vous devez d'abord vous connecter à Dockerlogin. 3. Déploiement sur Kubernetes: écrivez Deployment.yaml pour définir le déploiement, définissez le nombre de répliques, les images de conteneurs et les restrictions de ressources, et écrivez Service.yaml pour créer

Importjava.ioandjava.net.socketfori / oandsocketcommunication.2.CreateasockingObjectToConnectTotheServerusingHostNAMEAndport.3.USEPRINTWRERTOSENDDATAVIATPUTSTREMANDBUFFERDREDERTOREADSERVERSPONSESESES

Dans VSCODE, vous pouvez rapidement changer le panneau et la zone d'édition via des touches de raccourci. Pour sauter vers le panneau d'explorateur gauche, utilisez Ctrl Shift E (Windows / Linux) ou CMD Shift E (Mac); Retournez dans la zone d'édition pour utiliser Ctrl `ou ESC ou Ctrl 1 ~ 9. Par rapport au fonctionnement de la souris, les raccourcis clavier sont plus efficaces et n'interrompent pas le rythme de codage. Les autres conseils incluent: Ctrl KCTRL E FOCUS RECHERCH BOX, F2 Renommer Fichier, Supprimer le fichier, Entrez le fichier ouvert, le dossier de la touche Arrow Extend / Effondrement.

Chargez le pilote JDBC et établissez une connexion de base de données; 2. Utiliser Connection.PrepareStatement () Pour créer une instruction SQL contenant un espace réservé; 3. Appel SetString (), setInt () et autres méthodes pour définir les valeurs des paramètres à partir de 1; 4. Appelez EXECUTEUPDate (), ExecuteQuery () ou Execute () en fonction du type SQL pour exécuter des instructions; 5. Utilisez des ressources TRY-With-With pour fermer automatiquement les ressources de connexion, de statement de préparation et de résultat pour éviter les fuites de mémoire et assurer un traitement sûr et efficace des opérations de base de données.

StaticFieldSholdingObjectreferencesCanpreventGarBageCollection; useweakhashmaporcleanupmechanisms.2.UnclosedResourceslikestReamsorConnectionscauseleleaks; toujours usuretw
