OC3_歌词解析
//
// LrcManager.h
// OC3_歌词解析
//
// Created by zhangxueming on 15/6/15.
// Copyright (c) 2015年 zhangxueming. All rights reserved.
// #import <Foundation/Foundation.h>
#import "LrcItem.h" #define FilePath @"/Users/zhangxueming/Desktop/ios1509/Day16_类的复合设计/OC3_歌词解析/传奇.txt" @interface LrcManager : NSObject - (id)initWithFile:(NSString *)path; + (NSString *)userInterface:(float)aTime; @end
//
// LrcManager.m
// OC3_歌词解析
//
// Created by zhangxueming on 15/6/15.
// Copyright (c) 2015年 zhangxueming. All rights reserved.
// #import "LrcManager.h" //匿名类别(类扩展)
//能扩展方法与实例变量,实现了实例变量与方法的私有化
@interface LrcManager ()
{
NSString *_title; // 歌曲名
NSString *_author;// 歌词作者
NSMutableArray *_lrcList;//存lrcItem
} //解析歌词文件
- (BOOL)parseLrcFile:(NSString *)path;
//解析歌词标题
- (void)parseLrcTitle:(NSString *)lrcString;
//解析歌词演唱者
- (void)parseLrcAuthor:(NSString *)lrcString;
//解析歌词词条
- (void)parseLrcItem:(NSString *)lrcString;
//将时间字符串转换成浮点时间
- (float)timeByTimeString:(NSString *)aString; @end @implementation LrcManager - (id)initWithFile:(NSString *)path
{
self = [super init];
if (self) {
_lrcList = [NSMutableArray array];
[self parseLrcFile:path];
}
return self;
} - (BOOL)parseLrcFile:(NSString *)path
{
//读取歌词文件
NSString *fileContent = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
if (!fileContent) {
return NO;
}
//分割歌词字符串
NSArray *lrcArray = [fileContent componentsSeparatedByString:@"\n"]; for (NSString *lrcString in lrcArray) {
if ([lrcString isEqualToString:@""]) {
continue;
}
else if ([lrcString hasPrefix:@"[ti:"]) {
[self parseLrcTitle:lrcString];
}
else if ([lrcString hasPrefix:@"[ar:"])
{
[self parseLrcAuthor:lrcString];
}
else
{
[self parseLrcItem:lrcString];
}
}
//对可变数组排序
[_lrcList sortUsingSelector:@selector(isSortByTime:)];
return YES;
} - (void)parseLrcTitle:(NSString *)lrcString
{
_title = [lrcString substringWithRange:NSMakeRange(, [lrcString length]-)];
} - (void)parseLrcAuthor:(NSString *)lrcString
{
_author = [lrcString substringWithRange:NSMakeRange(, [lrcString length]-)];
}
//02:39.90
- (float)timeByTimeString:(NSString *)aString
{
NSArray *timeArray = [aString componentsSeparatedByString:@":"];
return [[timeArray objectAtIndex:] intValue]*+[[timeArray objectAtIndex:] floatValue];
} - (void)parseLrcItem:(NSString *)lrcString
{
NSArray *itemArray = [lrcString componentsSeparatedByString:@"]"];
NSInteger len = [itemArray count];
for (NSInteger i=; i<len-; i++)
{
LrcItem *item = [[LrcItem alloc] init];
NSString *timeString = [[itemArray objectAtIndex:i] substringFromIndex:];
[item setTime:[self timeByTimeString:timeString]];
[item setLrc:[itemArray lastObject]];
[_lrcList addObject:item];
}
}
//3.5 5.5 8.5 10.5 12.0
+ (NSString *)userInterface:(float)aTime
{
LrcManager *manager = [[LrcManager alloc] initWithFile:FilePath];
for (LrcItem *item in manager->_lrcList) {
[item printLrcItem];
}
NSInteger len = [manager->_lrcList count];
NSInteger i;
for (i=; i<len; i++) {
LrcItem *item = [manager->_lrcList objectAtIndex:i];
if (aTime < [item time]) {
return [[manager->_lrcList objectAtIndex:i-] lrc];
}
}
if (i==len) {
return [[manager->_lrcList objectAtIndex:i-] lrc];
}
return nil;
}
@end
//
// LrcItem.h
// OC3_歌词解析
//
// Created by zhangxueming on 15/6/15.
// Copyright (c) 2015年 zhangxueming. All rights reserved.
// #import <Foundation/Foundation.h> @interface LrcItem : NSObject
{
float _time;
NSString *_lrc;
} - (float)time;
- (NSString *)lrc; - (void)setTime:(float)aTime;
- (void)setLrc:(NSString *)aLrc; - (BOOL)isSortByTime:(LrcItem *)aItem; - (void)printLrcItem; @end
//
// LrcItem.m
// OC3_歌词解析
//
// Created by zhangxueming on 15/6/15.
// Copyright (c) 2015年 zhangxueming. All rights reserved.
// #import "LrcItem.h" @implementation LrcItem - (float)time
{
return _time;
} - (NSString *)lrc
{
return _lrc;
} - (void)setTime:(float)aTime
{
_time = aTime;
} - (void)setLrc:(NSString *)aLrc
{
_lrc = aLrc;
} - (BOOL)isSortByTime:(LrcItem *)aItem
{
if ([self time] > [aItem time]) {
return YES;
}
return NO;
} - (void)printLrcItem
{
NSLog(@"time = %.2f lrc = %@", [self time], [self lrc]);
} @end
//
// main.m
// OC3_歌词解析
//
// Created by zhangxueming on 15/6/15.
// Copyright (c) 2015年 zhangxueming. All rights reserved.
// #import <Foundation/Foundation.h>
#import "LrcManager.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
float time;
scanf("%f",&time);
NSLog(@"%@", [LrcManager userInterface:time]);
}
return ;
}
OC3_歌词解析的更多相关文章
- android 歌词解析
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...
- ios开发学习- 简易音乐播放器2 (基于iPhone4s屏幕尺寸)-- 歌词解析--plist文件应用--imageNamed图片加载耗内存
声明:(部分图片来自网络,如果侵犯了您的权益请联系我,会尽快删除!) 又是音乐播放器,不过这次和上次不一样了,准确说这次更像播放器了,初学者不建议看这个,可以先看前面一个音乐播放器(1),当然 我没加 ...
- iOS 音乐播放器之锁屏效果+歌词解析
概述 功能描述:锁屏歌曲信息.控制台远程控制音乐播放:暂停/播放.上一首/下一首.快进/快退.列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果).歌词解析并随音乐 ...
- iOS电商常见动画与布局、微信悬浮窗、音乐播放器、歌词解析、拖动视图等源码
iOS精选源码 MXScroll 介绍 混合使用UIScrollView ios 电商demo(实现各种常见动画效果和页面布局) 一行代码集成微信悬浮窗 可拖动,大小的视图,可放置在屏幕边缘. 在使用 ...
- C语言之歌词解析
0x00 脚下的路 不知道为啥要写这个小标题,可能是年轻的心想体验一下苍老的感觉,抑或是少年的一阵迷茫.混沌的四年,终究还是入了这一行.从初时的不知,到现在的刚开始,中间的间隔竟是四年之久,想起了陈奕 ...
- 网易云歌词解析(配合audio标签实现本地歌曲播放,歌词同步)
先看下效果 github上做的一个音乐播放器: https://github.com/SorrowX/electron-music 中文歌曲 英文歌曲(如果有翻译的中文给回返回出去) 韩文歌曲 来看下 ...
- Objective-C歌词解析
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { FILE* fp1;//定义文件指针 ...
- 歌词解析&class
class song_song: def __init__(self,lrc_file): # 定义两个字典一个列表备用 self.song_file = lrc_file self.song_lrc ...
- python 将歌词解析封装成类,要求:提供一个方法(根据时间返回歌词) - 提示:封装两个类:歌词类、歌词管理类
自己写的 有更好方案的大佬可以讨论一下 import bisectclass Lrc(): def __init__(self, sec, lrc): self.sec = sec self.lrc ...
随机推荐
- 杭电 2034 人见人爱A-B
http://acm.hdu.edu.cn/showproblem.php?pid=2034 人见人爱A-B Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 网络IPC:套接字
网络进程间通信(network IPC):不同计算机(通过网络相连)上运行的进程相互通信的机制. 套接字网络IPC接口:进程能够使用该接口和其他进程通信.通过该接口,其他进程运行位置是透明的,它们可以 ...
- Hive中数据的加载和导出
原文:http://blog.javachen.com/2014/06/09/hive-data-manipulation-language.html 关于 Hive DML 语法,你可以参考 apa ...
- Destroying the bus stations
Destroying the bus stations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1832 Acce ...
- Android(java)学习笔记107-1:通过反射获得带参构造方法并且使用
反射获得带参构造方法并且使用: 1. 获取字节码文件对象 Class c = Class.forName("cn.itcast_01.Person"); 2.获取带参构 ...
- ArcGis:vs c#编程遇到问题The specified filename is invalid
出现这个问题总归一点那就是你没有添加一个控件axLicenseControl这个控件导致报这个错误
- 用对象型泛型和ArraysList写一个输入学员信息并展示
题目:录入学员信息并保存,当录入学员的编号为0时结束,展示出学员信息 //student类 public class Student { public int id; public String na ...
- shell(1)
bash变量类别: 本地变量 : 又叫局部变量,仅对当前shell进程有效 环境变量 : 当前shell及其子shell,子子shell-. 特殊变量 : $? 上一个命令执行的状态,0表示执行成功 ...
- Linux基本命令之逻辑测试一
1.判断一个命令的结果使用test,其返回0,或一个整数.返回0表示true,返回整数表示错误码 2.获取上一个命令的返回结果使用$? 3.例如 我的服务器上面存在/home/www这样一个文件夹,所 ...
- 关于JDK中的设计模式
结构型模式: 适配器模式: 用来把一个接口转化成另一个接口. java.util.Arrays#asList() javax.swing.JTable(TableModel) java.io.Inpu ...