ダイクストラ法の実装などで使うかもしれないので、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

