iOS study Day10-歌曲列表

时间:2021-09-17 22:41:50

//定义三个新类:SongPlayListMusicCollection

//Song对象包含着关于特定歌曲的信息,比如歌曲名songName、艺术家artist、专辑album、歌曲长度length等;

//PlayList对象包含播放列表名称和一个歌曲的集合;

//MusicCollection对象包含PlayList集合,它包含一个名为Library的主播放列表,这个列表包含该集合中的所有歌曲。

//

//定义上述三个类,并编写方法实现下列功能:

//a.创建一个Song对象,并设置其信息。

//b.创建一个PlayList对象,并对播放列表添加和删除歌曲。

//添加:如果一首歌曲不在主列表中,那么将其添加进去。

//c.从主播放列表删除歌曲:确保从主播放列表中删除一首歌时,也要从音乐集合中的其他播放列表中删除此歌曲。

//d.创建一个MusicCollection对象,并对该集合添加和删除播放列表。

//e.搜索并显示关于所有歌曲、播放列表和整个音乐集合的信息。

//f.确保所有你定义的类都不产生内存泄漏。

//g.实现排序和模糊查找功能。

#import <Foundation/Foundation.h>
#import "PlayList.h"
#import "MusicCollection.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool
    {

        Song* song1 = [[[Song alloc] initWithName:@"风往北吹" artist:@"孙楠"album:@"拯救" length: 430] autorelease];
        Song* song2 = [[[Song alloc] initWithName:@"东京爱情故事" artist:@"匿名" album:@"未知" length:440] autorelease];
        Song* song3 = [[[Song alloc] initWithName:@"花田错" artist:@"王力宏" album:@"改变自己" length:380] autorelease];
        Song* song4 = [[[Song alloc] initWithName:@"明天你是否依然爱我" artist:@"未知" album:@"未知" length:290] autorelease];
        Song* song5 = [[[Song alloc] initWithName:@"捡肥皂" artist:@"某某" album:@"IOS不得了" length:315] autorelease];
        Song* song6 = [[[Song alloc] initWithName:@"逆光" artist:@"孙燕姿" album:@"逆光" length:342426430] autorelease];
        Song* song7 = [[[Song alloc] initWithName:@"相约98" artist:@"孙楠" album:@"拯救" length:342423430] autorelease];
        Song* song8 = [[[Song alloc] initWithName:@"捡肥皂" artist:@"某某" album:@"IOS不得了" length:372423430] autorelease];
        
        PlayList * pl1 = [[[PlayList alloc] initWithName:@"list爱情圣地"] autorelease];
        [pl1 addSongtoList:song1];
        [pl1 addSongtoList:song2];
        [pl1 addSongtoList:song3];
        [pl1 addSongtoList:song4];
        [pl1 addSongtoList:song5];
        
        
        PlayList * pl2 = [[[PlayList alloc] initWithName:@"list新不了情"] autorelease];
        [pl2 addSongtoList:song6];
        [pl2 addSongtoList:song7];
        [pl2 addSongtoList:song8];
        
        PlayList * pl3 = [[[PlayList alloc] initWithName:@"listiOS还行"] autorelease];
        [pl3 addSongtoList:song5];
        [pl3 addSongtoList:song7];
        [pl3 addSongtoList:song8];
        
        [pl1 description];
        
        //排序
        [pl1 sortList];
        
        [pl2 description];
        [pl3 description];
        
        
        [pl1 removeSongFromList:song2];
        
        MusicCollection *mc = [[[MusicCollection alloc] init] autorelease];
        
        //主列表只有一个,系统会判断如果有主列表则将其清空后再添加,如果列表在副歌列表则将其移动至主列表
        [mc addPlaylistToSet2:pl1];
        [mc addPlaylistToSet2:pl2];
        [mc addPlaylistToSet2:pl3];
        [mc addPlaylistToSet:pl2];
        [mc addPlaylistToSet:pl1];
        
        //模糊查找
        [mc serchForSongName:@"花"];

        
 //c.从主播放列表删除歌曲:确保从主播放列表中删除一首歌时,也要从音乐集合中的其他播放列表中删除此歌曲。
        [mc removeSongFromSet:song5];
    }
    return 0;
}

#import <Foundation/Foundation.h>

#import <Cocoa/Cocoa.h>
@interface Song : NSObject

@property (nonatomic, copy) NSString* songName;
@property (nonatomic, copy) NSString* artist;
@property (nonatomic, copy) NSString* album;
@property (nonatomic, assign) long length;

-(void) SetName:(NSString*)sname
         artist:(NSString*)art
          album:(NSString*)alb
         length:(long)len;

-(id) initWithName:(NSString*)sname
            artist:(NSString*)art
             album:(NSString*)alb
            length:(long)len;

-(BOOL) isEqualTo:(Song*)thesong;

-(NSString*)description;

-(NSComparisonResult)sort:(Song*) song2;

-(BOOL)hasWord:(NSString*)keyword;

@end

#import "Song.h"

@implementation Song

@synthesize songName,album,artist,length;

-(void) SetName:(NSString*)sname
         artist:(NSString*)art
          album:(NSString*)alb
         length:(long)len
{
    songName=sname;
    album = alb;
    artist = art;
    length = len;
    
}

-(id) initWithName:(NSString*)sname
            artist:(NSString*)art
             album:(NSString*)alb
            length:(long int)len
{
    if (self=[super init]) {
        [self SetName:sname artist:art album:alb length:len];
    }
    return self;
}

- (void)dealloc
{
    songName =nil;
    artist = nil;
    album = nil;
    [super dealloc];
}


-(BOOL) isEqualTo:(Song*)theSong
{
    if ([theSong.songName isEqualToString:self.songName ] &&
         [theSong.artist isEqualToString:self.artist ] &&
         [theSong.album isEqualToString:self.album] &&
         theSong.length == self.length)
    {
        return true;
    }
    return false;
}

-(NSString*)description
{
    return [NSString stringWithFormat:@"%@ @ %@ from %@ long:%li",songName,artist,album,length];
}


-(NSComparisonResult)sort:(Song*) song2
{
    if (self.length > song2.length) {
        return NSOrderedDescending;
    } else if (self.length < song2.length){
        return NSOrderedAscending;
    }
    return NSOrderedSame;
//    if ([songName compare:song2.songName]>0) {
//        return NSOrderedDescending;
//    } else if ([songName compare:song2.songName]<0){
//        return NSOrderedAscending;
//    }
//    return NSOrderedSame;
}

-(BOOL)hasWord:(NSString*)keyword
{
    if ([songName rangeOfString:keyword].length >0 ) {
        return YES;
    }
    return NO;
}

@end

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "Song.h"

@interface PlayList : NSObject

@property (nonatomic,retain) Song* song;
@property (nonatomic,copy) NSString* name;
@property (nonatomic,retain) NSMutableArray* songlist;

-(id)initWithName:(NSString*)listname;

-(void)addSongtoList:(Song*)theSong;

-(void)removeSongFromList:(Song*)theSong;

-(void)description;


-(void)sortList;


-(void)serchForSongName:(NSString*) keyword;

@end

#import "PlayList.h"

@implementation PlayList
@synthesize song,name,songlist;


-(id)initWithName:(NSString*)listname
{
    if (self=[super init]) {
        self.name = listname;
        self.songlist = [[[NSMutableArray alloc] init] autorelease];
    }
    return self;
}

-(void)addSongtoList:(Song*)theSong
{
    for (Song * song1 in songlist)
    {
        if ([song1 isEqualTo:theSong]) {
            NSLog(@"歌曲:%@ 已存在!添加失败",theSong.songName);
            return;
        }
    }
    [songlist addObject:theSong];
    NSLog(@"歌曲:%@,添加成功!", theSong.songName);
    return;
    
}

-(void)removeSongFromList:(Song*)theSong
{
    for(Song * song1 in songlist)
    {
        if([song1 isEqualTo:theSong])
        {
            [songlist removeObject:song1];
            NSLog(@"remooved \"%@\"from %@!",song1.songName ,self.name);
            return;
        }
    }
}

-(void)description
{
    NSLog(@"列表:%@,所含歌数:%li", name, songlist.count );
    NSLog(@"---------------");
    for( Song* song1 in songlist)
        NSLog(@"%@",[song1 description]);
}

-(void)sortList
{
    [songlist sortUsingSelector:@selector(sort:)];
    NSLog(@"排序后:\n");
    [self description];
}
-(void)serchForSongName:(NSString*) keyword
{
    NSLog(@"在%@中符合查找标准'%@'的歌曲有:\n",name,keyword);
    
    for (Song* song1 in songlist)
    {
        if ([song1 hasWord:keyword])
            NSLog(@"%@",song1.songName);
    }
    NSLog(@"--------------");
    
}
@end

#import <Foundation/Foundation.h>
#import "PlayList.h"
@interface MusicCollection : NSObject

@property (nonatomic, copy) PlayList* playlist;
@property (nonatomic, retain) NSMutableSet* playSet;
@property (nonatomic, retain) NSMutableSet* playSet2;

-(void)addPlaylistToSet:(PlayList* )theList;
-(void)addPlaylistToSet2:(PlayList* )theList;
-(void)removePlaylist;
-(void)removePlaylist2;
-(void)removePlaylist2:(PlayList*)thelist;
-(void)removeSongFromSet:(Song* )song1;

-(void)serchForSongName:(NSString*) keyword;
@end

#import "MusicCollection.h"

@implementation MusicCollection
@synthesize playlist,playSet,playSet2;


-(void)addPlaylistToSet:(PlayList* )theList
{
    if (playSet.count == 0) {
        [playSet addObject:theList];
        playlist = theList;
        NSLog(@"%@添加至主播放列表!",theList.name);
    } else {
        [self removePlaylist];
        [self addPlaylistToSet:theList];
        playlist = theList;
        [self removePlaylist2:theList];
    }
    return;
}
-(void)addPlaylistToSet2:(PlayList* )theList
{
        [playSet2 addObject:theList];
        NSLog(@"%@添加至副播放列表!",theList.name);
        return;
}
-(void)removePlaylist
{
    [playSet removeAllObjects];
    NSLog(@"已清空播放列表。");
    return;
}
-(void)removePlaylist2
{
    [playSet2 removeAllObjects];
    NSLog(@"已清空播放列表。");
    return;
}

-(void)removePlaylist2:(PlayList*)thelist
{
    if ([playSet2 containsObject:thelist]) {
        [playSet2 removeObject:thelist];
        NSLog(@"移除%@从副歌列表",thelist.name);
    }
}

-(void)removeSongFromSet:(Song* )song1
{
    [playlist removeSongFromList:song1];
    for (PlayList* playlist2 in playSet2)
    {
        [playlist2 removeSongFromList:song1];
    }
}

-(void)serchForSongName:(NSString*) keyword
{
    [playlist serchForSongName:keyword];
    for (PlayList* list2 in playSet2)
        [list2 serchForSongName:keyword];
}

-(id)init
{
    if (self = [super init]) {
        playSet = [[[NSMutableSet alloc] init] autorelease];
        playSet2 = [[[NSMutableSet alloc] init] autorelease];
        NSLog(@"添加Set成功!");
    }
    
    return self;
}
@end