AMcoder - javascript, python, java, html, php, sql

android ցուցակագրում է բոլոր թղթապանակները, որոնք ունեն պատկեր

Որպես իմ հավելվածի մաս, ես պետք է ունենամ ֆայլերի դիտարկիչ, որը թվարկում է միայն կոնկրետ թղթապանակներ: Օրինակ՝ թվարկեք միայն այն թղթապանակները, որտեղ պատկերի ֆայլը գտնվում է իր ցանկացած ենթաթղթապանակում՝ ցանկացած մակարդակում:

Ես կարող էի դա անել՝ օգտագործելով ռեկուրսիա: Բայց դա ազդում է կատարողականի վրա: Հատկապես վերին մակարդակում թղթապանակներ գտնելու համար անհրաժեշտ են բազմաթիվ ռեկուրսիվ զանգեր: Կա՞ դա անելու ավելի լավ միջոց

Խնդրում եմ տես իմ կոդը ստորև

public List<GeneralFileItem> getGridItemsList(String root) {
    List<GeneralFileItem> gridItemsList = new ArrayList<GeneralFileItem>();
    File file;
    file = new File(root);
    File list[] = file.listFiles();
    if (list.length == 0) {
        return null;
    }
    for (int i = 0; i < list.length; i++) {
        GeneralFileItem item = new GeneralFileItem();
        File temp_file = new File(file.getAbsolutePath(), list[i].getName());
        if (hasPhoto(temp_file)) {
            item.setPath(file.getAbsolutePath() + "/" + list[i].getName());
            item.setName(list[i].getName());
            if (temp_file.listFiles() != null) {
                item.setType(GeneralFileItem.DIRECTORY_TYPE);
            } else {
                item.setType(GeneralFileItem.FILE_TYPE);
            }
            gridItemsList.add(item);
            //Log.i(TAG,"added"+list[i].getName());
        }
    }
    return gridItemsList;

}

private boolean hasPhoto(File temp_file) {
    //Log.i(TAG,temp_file.getName());

    if (temp_file.listFiles() == null) {
        if (temp_file.getName().toUpperCase().endsWith(("JPG"))) {
            //Log.i(TAG,temp_file.getName()+ "is a photo");
            return true;
        } else
            return false;

    }
    else{
        File list[] = temp_file.listFiles();

        for (int i = 0; i < list.length; i++) {
            if(hasPhoto(list[i]))
                return true;
        }

    }

    return false;
}

Ես ուզում եմ իմանալ, արդյոք կա՞ այլ ճանապարհ, քան ռեկուրսիվ որոնումը: Ինչպես են ֆայլերը պահվում Android-ում: Ես գիտեմ, որ տարբեր ֆայլային համակարգեր աջակցվում են, և դա տարբերվում է ապարատային արտադրողներից: Ես կցանկանայի իմանալ, արդյոք կա՞ այնպիսի միջոց, ինչպիսին կա FileTable-ը, որտեղից կարող եմ ստանալ բոլոր .jpg ֆայլերը:


  • փորձեք օգտագործել docs.oracle.com/javase/ 1.4.2/docs/api/java/io/.... 15.05.2012
  • շնորհակալություն ձեր պատասխանի համար: Ձեր առաջարկած ֆայլի ֆիլտրի ինտերֆեյսը օգտակար է բոլոր պատկերային ֆայլերը ընթացիկ գրացուցակում ստանալու համար: Իմ պահանջն է ստանալ բոլոր դիրեկտորիաները, որոնք ունեն առնվազն մեկ պատկեր իրենց ենթապանակներում ցանկացած մակարդակում: 16.05.2012
  • ստուգեք այս հղումը, հուսով եմ, որ այն օգտակար կլինի stackoverflow.com/questions/4195660/ 29.09.2014
  • @preetha կարո՞ղ եք ասել MW-ին, թե ինչպես եք լուծել ձեր խնդիրը, ես նույնպես բախվում եմ նույնին 16.12.2014

Պատասխանները:


1

օգտագործել FilenameFilter՝ հատուկ տեսակի որոնելու համար ֆայլերի.

Ներկայումս դուք ստուգում եք միայն ընթացիկ գրացուցակը: Այնուամենայնիվ, եթե ցանկանում եք որոնել ռեկուրսիվ, ապա դուք պետք է ստուգեք՝ հայտնաբերված յուրաքանչյուր ֆայլ գրացուցակ է, թե ոչ:

Ձեր ալգոն նման կլինի

File file;
file = new File(root);
File list[] = file.listFiles();
if (list.length == 0) {
    return null;
}
for (int i = 0; i < list.length; i++) {
     if(list[i].isDirectory()){
        //Then go inside it to search for specific file 
        File subList[] = list[i].listFiles();
        //search for jpg..
        }else if("is this jpg"){
         //Add to list
        }
     }

Սա պարզեցնելու համար դուք կարող եք դրանք բաժանել մեթոդների ըստ ձեր պահանջի:

16.05.2012
  • ես այժմ ռեկուրսիա եմ անում։ Իմ խնդիրն այն է, որ ռեկուրսիվ որոնումն ավարտելու համար հսկայական ժամանակ է պահանջվում: Ես չեմ կարողանում հասկանալ, թե ինչպես ֆայլի ֆիլտրը կօգնի բարելավել կատարողականը, քանի որ այստեղ կրիտիկական կետը ռեկուրսիվորեն վերլուծում է: Եթե ​​ես գտնվում եմ մի պանակում, որն ունի ավելի քիչ ենթաթղթապանակներ, իմ ալգոն ավելի արագ է 16.05.2012
  • Խնդիրն այն է, որ դուք սկզբում որոնում եք ամբողջ տարածքում, այն ավելացնում ցուցակում և այնուհետև ներկայացնում եք gridview-ում: կարող եք փորձել ծույլ բեռնել, տես այստեղ օրինակ github.com/desertjim/LazyLoadingGridView 17.05.2012

  • 2

    Ահա մի բան, որ ես հասկացա: Այն աշխատում է հմայքի պես:

    Նախ պետք է ստեղծեք Ֆայլ, սա SD քարտի արմատն է

    File = rootPrimary = new File(Environment.getExternalStorageDirectory());
    

    քան դուք պետք է թվարկեք բոլոր ֆայլերը Ֆայլում []

    File[] fileArray = rootDirectory.listFiles();
    

    Այնուհետև դուք ստեղծում եք ArrayList և այն հավասարեցնում եք իմ ստեղծած մեթոդին և փոխանցեք Ֆայլը[]:

    ArrayList<File> alFolders = new ArrayList<File>();
            alFolder = putImgFldr(fileArray);
    

    Այս մեթոդը կավելացնի բոլոր dorectorye-ները, որոնք պարունակում են .jpg և .png ընդլայնումներով պատկերներ:

    private ArrayList<File> putImgFldr(File[] fileArray) {
            // TODO Auto-generated method stub
            ArrayList<File> a = new ArrayList<File>();
    
            for (int i = 0; i < fileArray.length; i++) {
                if (fileArray[i].isDirectory()) {
                    //if file is folder pass that file trough this method
                    a.addAll(putImgFldr(fileArray[i].listFiles()));
                } else if (fileArray[i].getAbsolutePath().endsWith(".jpg") || fileArray[i].getAbsolutePath().endsWith(".png")) {
                    // if file is img ad it's parent, folder to ArrayList 
                    a.add(fileArray[i].getParentFile());
                    // this finishes the file searching 
                    // because the image has allready bean found
                    i = fileArray.length + 1;
                }
            }
            return a;
        }
    

    այժմ Դուք կարող եք ևս մեկ Ֆայլ [] ավելացնել alFolders-ում, եթե դա անհրաժեշտ է

    alFolders.addAll(putImgFldr(secFileArray));
    
    31.01.2016

    3

    Java 8 filter օգտագործող ֆայլերի և գրացուցակների ցուցակագրման ևս մեկ օրինակ: Օրինակ, այստեղ ես օգտագործում եմ պարզապես jpeg պատկերներ

    public static void main(String[] args) {
    
    System.out.println("Files!!");
            try {
                Files.walk(Paths.get("."))
                        .filter(Files::isRegularFile)
                        .filter(c ->
                                c.getFileName().toString().substring(c.getFileName().toString().length()-4).contains(".jpg")
                                ||
                                c.getFileName().toString().substring(c.getFileName().toString().length()-5).contains(".jpeg")
                        )
                        .forEach(System.out::println);
    
            } catch (IOException e) {
            System.out.println("No jpeg or jpg files");
            }
    
            System.out.println("\nDirectories!!\n");
            try {
                Files.walk(Paths.get("."))
                        .filter(Files::isDirectory)
                        .forEach(System.out::println);
    
            } catch (IOException e) {
                System.out.println("No Jpeg files");
            }
    }
    
    04.08.2020
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..