サムネがコーヒーの記事は書きかけです。

システムファイルの再帰的巡回

ダイクストラ法の実装などで使うかもしれないので、2個以上のノードクラスを保持した木構造クラスを巡回するアルゴリズムについて考えたものを置いておきます。

class File:
    def __init__(self, fileName:str, fileSize:int):
        self.fileName : str = fileName
        self.fileSize : int = fileSize

    def __repr__(self) -> str:
        return f"name : {self.fileName}, size : {self.fileSize}"

class T:
    def __init__(self,name:str,files:list[File],subT:list) -> None:
        self.name : str = name
        self.files : list[File] = files
        self.subT : list[T] = subT

    def __repr__(self) -> str:
        return f"{','.join([i.name for i in self.subT])}" 

hwWeek1 = T('hwWeek1',[File("sample1.pdf",1900),File('wa01.txt',200)],[])
hwWeek2 = T('hwWeek2',[File("sample2.pdf",2992),File('wa02.txt',340)],[])

homework = T('homework',[File("syllabus.pdf",1200)],[hwWeek1,hwWeek2])

pa01 = T('pa01',[File("pa01.pdf",320),File('pa01.py',188)],[])
pa02 = T('pa02',[File("pa02.pdf",985),File('pa02.py',1929)],[])

pa = T('PA',[File("syllabus_pa.pdf",1200)],[pa01,pa02])


desktop =  T('desktop', [File("project1.java",809)],[homework,pa]
)




def search(folder:T, target:str) -> str:
    if target.split("/")[-1] in [i.fileName for i in folder.files]:
        return folder.name + "/" + target
    
    for i in folder.subT:
        if target.split("/")[-1] in [i.fileName for i in i.files]:
            return folder.name +"/"+ i.name +"/" + target
        search(i,target)
    return "File not found."

def total_size(folder:T,total = 0) -> int:
    total += sum([i.fileSize for i in folder.files])
    for i in folder.subT:
        total += total_size(i)
    return total

print(search(desktop,"syllabus_pa.pdf"))
print(search(desktop,"syllabus.pdf"))
print(search(desktop,'project1.java'))
print(total_size(desktop))
>>>
desktop/PA/syllabus_pa.pdf
desktop/homework/syllabus.pdf
desktop/project1.java
12063

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です