Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions group27/513274874/homework/src/com/coding/basic/LinkedList.java
Original file line number Diff line number Diff line change
Expand Up @@ -185,4 +185,81 @@ public void setNext(Node next) {
}


/**
* 把该链表逆置
* 例如链表为 3->7->10 , 逆置后变为 10->7->3
*/
public void reverse(){

}

/**
* 删除一个单链表的前半部分
* 例如:list = 2->5->7->8 , 删除以后的值为 7->8
* 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10

*/
public void removeFirstHalf(){

}

/**
* 从第i个元素开始, 删除length 个元素 , 注意i从0开始
* @param i
* @param length
*/
public void remove(int i, int length){

}
/**
* 假定当前链表和listB均包含已升序排列的整数
* 从当前链表中取出那些listB所指定的元素
* 例如当前链表 = 11->101->201->301->401->501->601->701
* listB = 1->3->4->6
* 返回的结果应该是[101,301,401,601]
* @param list
*/
public int[] getElements(LinkedList list){
return null;
}

/**
* 已知链表中的元素以值递增有序排列,并以单链表作存储结构。
* 从当前链表中中删除在listB中出现的元素

* @param list
*/

public void subtract(LinkedList list){

}

/**
* 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。
* 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)
*/
public void removeDuplicateValues(){

}

/**
* 已知链表中的元素以值递增有序排列,并以单链表作存储结构。
* 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素)
* @param min
* @param max
*/
public void removeRange(int min, int max){

}

/**
* 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同)
* 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列
* @param list
*/
public LinkedList intersection( LinkedList list){
return null;
}


}
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
package com.coderising.download;
package com.coding.coderising.download;

import com.coderising.download.api.Connection;
import com.coding.coderising.download.api.Connection;

import java.io.IOException;
import java.io.RandomAccessFile;

public class DownloadThread extends Thread{

Connection conn;
int startPos;
int endPos;

// 将下载到的字节输出到raf中
private RandomAccessFile raf;

public DownloadThread( Connection conn, int startPos, int endPos){

this.conn = conn;
this.startPos = startPos;
this.endPos = endPos;
}
public void run(){

public void run(){
try {
conn.read(startPos,endPos);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.coderising.download;
package com.coding.coderising.download;

import com.coderising.download.api.Connection;
import com.coderising.download.api.ConnectionException;
import com.coderising.download.api.ConnectionManager;
import com.coderising.download.api.DownloadListener;
import com.coding.coderising.download.api.Connection;
import com.coding.coderising.download.api.ConnectionException;
import com.coding.coderising.download.api.ConnectionManager;
import com.coding.coderising.download.api.DownloadListener;


public class FileDownloader {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.coderising.download;
package com.coding.coderising.download;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.coderising.download.api.ConnectionManager;
import com.coderising.download.api.DownloadListener;
import com.coderising.download.impl.ConnectionManagerImpl;
import com.coding.coderising.download.api.ConnectionManager;
import com.coding.coderising.download.api.DownloadListener;
import com.coding.coderising.download.impl.ConnectionManagerImpl;

public class FileDownloaderTest {
boolean downloadFinished = false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.coderising.download.api;
package com.coding.coderising.download.api;

import java.io.IOException;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.coderising.download.api;
package com.coding.coderising.download.api;

public class ConnectionException extends Exception {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.coderising.download.api;
package com.coding.coderising.download.api;

public interface ConnectionManager {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.coderising.download.api;
package com.coding.coderising.download.api;

public interface DownloadListener {
public void notifyFinished();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.coding.coderising.download.demo;

import java.io.InputStream;
import java.io.RandomAccessFile;

public class DownThread extends Thread {

// 定义字节数组(取水的竹筒)的长度
private final int BUFF_LEN = 32;

// 定义下载的起始点
private long start;

// 定义下载的结束点
private long end;

// 下载资源对应的输入流
private InputStream is;

// 将下载到的字节输出到raf中
private RandomAccessFile raf;


// 构造器,传入输入流,输出流和下载起始点、结束点
public DownThread(long start, long end, InputStream is, RandomAccessFile raf) {
// 输出该线程负责下载的字节位置
System.out.println(start + "---->" + end);
this.start = start;
this.end = end;
this.is = is;
this.raf = raf;
}

@Override
public void run() {
try {
is.skip(start);
raf.seek(start);
// 定义读取输入流内容的的缓存数组(竹筒)
byte[] buff = new byte[BUFF_LEN];
// 本线程负责下载资源的大小
long contentLen = end - start;
// 定义最多需要读取几次就可以完成本线程的下载
long times = contentLen / BUFF_LEN + 4;
// 实际读取的字节数
int hasRead = 0;
for (int i = 0; i < times; i++) {
hasRead = is.read(buff);
// 如果读取的字节数小于0,则退出循环!
if (hasRead < 0) {
break;
}
raf.write(buff, 0, hasRead);
}
} catch (Exception ex) {
ex.printStackTrace();
}
// 使用finally块来关闭当前线程的输入流、输出流
finally {
try {
if (is != null) {
is.close();
}
if (raf != null) {
raf.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.coding.coderising.download.demo;

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;

public class MutilDown {

public static void main(String[] args) {
//定义几个线程去下载
final int DOWN_THREAD_NUM = 4;
final String OUT_FILE_NAME = "down.jpg";
InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];
RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];
try {
// 创建一个URL对象
URL url = new URL("http://hiphotos.baidu.com/240728057/pic/item/6a50e38242aad8f60cf4d2b3.jpg");
// 以此URL对象打开第一个输入流
isArr[0] = url.openStream();
long fileLen = getFileLength(url);
System.out.println("网络资源的大小" + fileLen);
// 以输出文件名创建第一个RandomAccessFile输出流
//创建从中读取和向其中写入(可选)的随机存取文件流,第一个参数:文件名,第二个参数是:参数指定用以打开文件的访问模式
//"rw"可能是可读可写,
outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");
// 创建一个与下载资源相同大小的空文件
for (int i = 0; i < fileLen; i++) {
outArr[0].write(0);
}
// 每线程应该下载的字节数
long numPerThred = fileLen / DOWN_THREAD_NUM;
// 整个下载资源整除后剩下的余数取模
long left = fileLen % DOWN_THREAD_NUM;
for (int i = 0; i < DOWN_THREAD_NUM; i++) {
// 为每个线程打开一个输入流、一个RandomAccessFile对象,
// 让每个线程分别负责下载资源的不同部分。
//isArr[0]和outArr[0]已经使用,从不为0开始
if (i != 0) {
// 以URL打开多个输入流
isArr[i] = url.openStream();
// 以指定输出文件创建多个RandomAccessFile对象
outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");
}
// 分别启动多个线程来下载网络资源
if (i == DOWN_THREAD_NUM - 1) {
// 最后一个线程下载指定numPerThred+left个字节
new DownThread(i * numPerThred, (i + 1) * numPerThred
+ left, isArr[i], outArr[i]).start();
} else {
// 每个线程负责下载一定的numPerThred个字节
new DownThread(i * numPerThred, (i + 1) * numPerThred,
isArr[i], outArr[i]).start();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

// 定义获取指定网络资源的长度的方法
public static long getFileLength(URL url) throws Exception {
long length = 0;
// 打开该URL对应的URLConnection
URLConnection con = url.openConnection();
// 获取连接URL资源的长度
long size = con.getContentLength();
length = size;
return length;
}

}
Loading