java中collection框架應用示例:學生選課系統(tǒng)

java中集合框架概述


image.png
  • collection集合框架存儲對象呕乎,有多個接口list荚斯,queue妖啥,set霉颠。他們對應的重要實現(xiàn)類分別是ArrayList,LinkedList迹栓,HashSet

定義類圖

image.png

public class Course {

public String id;
public String name;
public Course(String id,String name){
    this.id=id;
    this.name=name;
}
public Course(){
}

}

public class Student {

public String id;
public String name;

public Set<Course> courses;

public Student(String id,String name){
    this.id=id;
    this.name=name;
    this.courses=new HashSet<Course>();
}

}

使用List接口


image.png
image.png

/*

  • 備選課程類
    */

public class ListTest {

public List courseToSelect;


/*
 * 用于存放備選課程的list
 */


public ListTest(){
    this.courseToSelect = new ArrayList();
}


/*
 * 用于往coursetoselect中添加備選課程
 */
public void testAdd(){
    //創(chuàng)建一個課程對象并通過調用add方法掉分,添加到備選課程list中
    Course cr1= new Course("1","數(shù)據(jù)結構");
    courseToSelect.add(cr1);
    Course temp= (Course) courseToSelect.get(0);
    //System.out.println("添加了課程:"+temp.id+":"+temp.name);
    
    Course cr2 = new Course("2","c語言");
    courseToSelect.add(0, cr2);
    Course temp2=(Course)courseToSelect.get(0);
 //System.out.println("添加了課程:"+temp2.id+":"+temp2.name);
    courseToSelect.add(cr1);
    Course temp0= (Course) courseToSelect.get(2);
    //System.out.println("添加了課程:"+temp0.id+":"+temp0.name);
    
          //以下會拋出數(shù)組下標越界異常
           //Course cr3 = new Course("3","cdsfsf");
          //courseToSelect.add(4, cr3);
          Course[] course={new Course("3","離散數(shù)學"),new Course("4","匯編語言")};
    courseToSelect.addAll(Arrays.asList(course));
    Course temp3=(Course)courseToSelect.get(3);
    Course temp4=(Course)courseToSelect.get(4);
    
    //System.out.println("添加了兩門課程:"+temp3.id+":"+
    //temp3.name+";"+temp4.id+":"+temp4.name);
    
    Course[] course2={new Course("5","高等數(shù)學"),new Course("6","大學英語")};
    courseToSelect.addAll(2, Arrays.asList(course2));
    Course temp5=(Course)courseToSelect.get(2);
    Course temp6=(Course)courseToSelect.get(3);
    
    //System.out.println("添加了兩門課程:"+temp5.id+":"+
    //temp5.name+";"+temp6.id+":"+temp6.name);

}


/*
 * 取得List中的元素的方法
 */

public void testGet(){
    int size =courseToSelect.size();
    System.out.println("有如下課程待選:");
    for(int i=0;i<size;i++){
        Course cr = (Course) courseToSelect.get(i);
        System.out.println("課程:"+cr.id+cr.name);
    }
    
}

/*
 * 通過迭代器遍歷List
 */

public void testIterator(){
    //通過集合的Iterator方法
    Iterator it = courseToSelect.iterator();
    System.out.println("有如下課程待選(通過迭代器訪問):");
    while(it.hasNext()){
        Course cr =(Course)it.next();
        System.out.println("課程:"+cr.id+cr.name);
    }
    
}

/*
 * 通過foreach方法訪問集合元素
 */
public void testForEach(){
    System.out.println("有如下課程待選(通過for each)):");
    for(Object obj:courseToSelect){
        //當元素被存入集合,其類型被忽略為object
        Course cr =(Course)obj;
        System.out.println("課程:"+cr.id+cr.name);
    }
}


/*
 * 修改list中的元素
 */
public void testModify(){
    courseToSelect.set(4, new Course("7","毛概"));
}

/*
 * 刪除list中的元素
 */
public void testRemove(){
//  Course cr =(Course)courseToSelect.get(4);
//  System.out.println("我是課程"+":"+cr.name+" 我即將被刪除");
    //System.out.println("即將刪除4位置上的課程克伊!");
    //courseToSelect.remove(4);
    
    
    System.out.println("即將刪除4位置和5 位置上的課程酥郭!");
    Course[] courses ={(Course) courseToSelect.get(4),(Course) courseToSelect.get(5)};
    courseToSelect.removeAll(Arrays.asList(courses));
    System.out.println("成功珊瑚課程!");
    testForEach();
}


/*
 * 往list中添加一些奇怪的東西
 *
 */

// public void testType(){
// System.out.println("能否在list");
// courseToSelect.add("字符串");
// //不能愿吹,用泛型規(guī)定添加的元素類型
// }

public static void main(String[] args){
    ListTest lt=new ListTest();
    lt.testAdd();
    lt.testForEach();

}

}

應用泛型管理課程


image.png

public class TestGeneric {

/*
 * 帶有泛型---course不从,的list類型屬性
 */

public List<Course> courses;

public TestGeneric(){
    this.courses=new ArrayList<Course>();
    
}

/*
 * 測試添加
 */

public void testAdd(){
    Course cr1 =new Course("1","大學語文");
    courses.add(cr1);
    //courses.add("能否添加一些奇怪的東西呢?犁跪?椿息?");//當然不能。編譯期間檢查坷衍,不是泛型規(guī)定的類型寝优,報錯
    //泛型集合中。不能添加 泛型規(guī)定的類型及其子類型以外的對象枫耳,否則會報錯乏矾!
    Course cr2 = new Course("2","java basic");
    courses.add(cr2);
}

/*
 * 測試循環(huán)遍歷
 */
public void testForEach(){
    for(Course cr:courses){
        System.out.println(cr.id+":"+cr.name);
    }
}

/*
 * 泛型集合可以添加泛型的子類型的對象實例
 */

public void testChild(){
    ChildCourse ccr = new ChildCourse();
    ccr.id="3";
    ccr.name="我是子類型的課程對象實例";
    courses.add(ccr);
}


/*
 * 泛型不能使用基本類型
 */
public void testBasicType(){
    List<Integer> list = new ArrayList<Integer>();
    //注意泛型中的限定類型不能使用基本類型,可以通過使用包裝類
    list.add(1);
    System.out.println("基本類型必須使用包裝類作為泛型!"+list.get(0));
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    TestGeneric tg=new TestGeneric();
    tg.testAdd();
    tg.testForEach();
    tg.testChild();
    tg.testForEach();
    tg.testBasicType();
}

}

public class ChildCourse extends Course {
}

使用set集合


image.png

image.png
public class SetTest {
public List<Course> courseToSelect;
public SetTest(){
        courseToSelect = new ArrayList<Course>();
}

public void testAdd(){
        //創(chuàng)建一個課程對象并通過調用add方法钻心,添加到備選課程list中
        Course cr1= new Course("1","數(shù)據(jù)結構");
        courseToSelect.add(cr1);
        
        Course cr2 = new Course("2","c語言");
        courseToSelect.add(0, cr2);
        
        Course[] course={new Course("3","離散數(shù)學"),new Course("4","匯編語言")};
        courseToSelect.addAll(Arrays.asList(course));

        
        Course[] course2={new Course("5","高等數(shù)學"),new Course("6","大學英語")};
        courseToSelect.addAll(2, Arrays.asList(course2));

        
}

public void testForEach(){
    System.out.println("有如下課程待選(通過for each)):");
    for(Object obj:courseToSelect){//當元素被存入集合凄硼,其類型被忽略為object
        Course cr =(Course)obj;
        System.out.println("課程:"+cr.id+cr.name);
    }
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    SetTest st = new SetTest();
    st.testAdd();
    st.testForEach();
    
    Student student = new Student("1","Ming");
    System.out.println("歡迎學生: "+student.name+" 選課");
    //創(chuàng)建一個scanner對象接受從鍵盤輸入的課程ID
    Scanner console = new Scanner(System.in);
    
    for(int i=0;i<3;i++){
        System.out.println("請輸入課程ID");
        String courseId = console.next();
        for(Course cr :st.courseToSelect){
            if(cr.id.equals(courseId)){
                student.courses.add(cr);
                /*
                 * set中,添加某個對象捷沸,無論添加多少次
                 * 最終只保留一個該對象(的引用)
                 * 并且摊沉,保留的是第一次添加的那一個
                 */
                //student.courses.add(null);//可以添加空對象,但是沒什么意義
        
        }
    }
}
    st.testForEachforSet(student);

}

public void testForEachforSet(Student student){
   //打印輸出痒给,學生所選的課程说墨!
    System.out.println("共選擇了:"+student.courses.size()+"門課程");
    for(Course cr:student.courses){
        System.out.println("選擇了課程:"+cr.id+cr.name);
    }
}

}

使用map接口


  • map提供映射關系,以鍵值對存儲侈玄。


    image.png
image.png

代碼示例

public class MapTest {

/*
 * 用來承裝學生類型對象
 */
public Map<String,Student>students;

/*
 * 在構造器中初始化student屬性
 */

public MapTest(){
    this.students = new HashMap<String,Student>();
}

/*
 * 測試添加:輸入學生id婉刀,判斷是否被占用
 * 若未被占用吟温。則輸入學生姓名序仙,創(chuàng)建新的學生對象,并且添加到students中
 */
public void testPut(){
    //創(chuàng)建一個scanner對象鲁豪,用來獲取輸入的學生ID和姓名
    Scanner console = new Scanner(System.in);
    int i = 0;
    while(i<3){
        System.out.println("請輸入學生ID");
        String ID =console.next();
        //判斷該ID是否被占用
        Student st =students.get(ID);
        if(st==null){
            //提示輸入學生姓名
            System.out.println("請輸入學生姓名");
            String name = console.next();
            //創(chuàng)建一個新的學生對象
            Student newStudent = new Student(ID,name);
            //通過調用studnets的put方法潘悼,添加ID-學生映射
            students.put(ID, newStudent);
            System.out.println("成功添加學生:"+students.get(ID).name);
            i++;
        }else{
            System.out.println("該學生ID已被占用");
            continue;
        }
    }
}

/*
 * 測試map的keySet方法
 */
public void testKeySet(){
    //通過keyset方法。返回map中的所有“鍵”的set集合
    Set<String> keySet = students.keySet();
    //取得stuents的容量
    System.out.println("總共有:"+students.size()+"個學生");
    //遍歷keyset爬橡,取得每一個鍵治唤,在調用get方法取得每個鍵對應的value
    for(String stuId:keySet){
        Student st =students.get(stuId);
        if(st!=null){
            System.out.println("學生:"+st.name);
        }
    }
}

/*
 * 測試刪除map中的映射
 */
public void testRemove(){
    //獲取從鍵盤輸入的待刪除學生ID字符串
    Scanner console = new Scanner(System.in);
    while(true){
        //提示輸入待刪除的學生的ID
        System.out.println("請輸入要刪除的學生ID!");
        String ID =console.next();
        //判斷該ID是都有對應的學生對象
        Student st =students.get(ID);
        if(st==null){
            //提示輸入的ID并不存在
            System.out.println("該ID不存在");
            continue;
        }
        students.remove(ID);
        System.out.println("成功刪除學生:"+st.name);
        break;
    }
}

/*
 * 通過entrySet方法來遍歷Map
 */
public void testEntrySet(){
    //通過entrySet該方法糙申,返回map中所有鍵值對
    Set<Entry<String,Student>> entrySet= students.entrySet();
    for(Entry<String,Student> entry:entrySet){
        System.out.println("取得鍵:"+entry.getKey());
        System.out.println("對應的值為"+entry.getValue().name);
    }
}

/*
 * 利用put方法修改map中的已有映射
 */
public void testModify(){
    //提示輸入要修改的學生ID
    System.out.println("請輸入要修改的學生ID:");
    //創(chuàng)建scanner對象宾添,獲取從鍵盤上輸入的學生ID字符串
    Scanner console = new Scanner(System.in);
    while(true){
        String stuID= console.next();
        //從tsudnets中差好啊該學生ID對應的學生對象
        Student student= students.get(stuID);
        if(student ==null){
            System.out.println("該ID不存在!請重新輸入柜裸!");
            continue;
        }
        //提示當前對應的學生對象的姓名
        System.out.println("當前該學生的ID:所對應的學生為"+student.name);
        //體術輸入新的學生姓名缕陕,來修改已有的映射
        System.out.println("請輸入新的學生姓名:");
        String name= console.next();
        Student newStudent = new Student(stuID,name);
        students.put(stuID, newStudent);
        System.out.println("修改成功!");
        break;
    }
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    MapTest mt = new MapTest();
    mt.testPut();
    mt.testKeySet();
    mt.testRemove();
    mt.testEntrySet();
    mt.testModify();
    mt.testEntrySet();
}

}

判斷是否包含某元素


image.png

利用contains方法

  • 該方法從collection繼承來
  • 下面測試list和set的contains方法

測試set的contains方法

public void testListContains(){

//取得備選課程序列的第0個元素
Course course = courseToSelect.get(0);
//打印輸出courseToSelect是否包含course對象
System.out.println("取得課程:"+course.name);
System.out.println("備選課程中是否包含課程:"+course.name+","+courseToSelect.contains(course));
//包含返回true疙挺,不包含返回false
//創(chuàng)建一個新的課程對象扛邑,ID和名稱,與course對象完全一樣
Course course2 = new Course(course.id,course.name);
System.out.println("新創(chuàng)建課程:"+course2.name);
System.out.println("備選課程中是否包含課程"+course2.name+","+courseToSelect.contains(course2));//**這里是false**

}

  • 所有類都繼承自object 有一個equals(Object obj)方法
  • contains(obj)方法實際是遍歷其中每一個元素铐然,調用每個元素的equals方法與參數(shù)obj比較蔬崩,所有都不相同,才返回false
  • 通過重寫equals方法可以實現(xiàn)通過contains是否包含名稱為某個值的課程元素
    在Course類中重寫equals方法

//Override

public boolean equals(Object obj){

    if(this==obj){
        return true;
    }
    if(obj==null)
        return false;
    if(!(obj instanceof Course))
        return false;
    Course course =(Course)obj;
    if(this.name==null){
        if(course.name==null)
            return true;
        else
            return false;
    }else{
        if(this.name.equals(course.name))
            return true;
        else
            return false;
    }
}

注:該equlas重寫方法可以作為一個模板使用

這之后運行setTest
其中System.out.println("備選課程中是否包含課程"+course2.name+","+courseToSelect.contains(course2));//
得到的這里是true搀暑,說明equals方法重載成功沥阳。

  • object中還有一個方法:hashCode()返回該對象的哈希碼的值

  • 當調用contains(obj)的時候,先調用每一個元素的hashcode()自点,相等再調用equals()桐罕。只有認為這兩個方法返回的值都相等的時候,才認定hashset包含這個元素

    @Override
    public int hashCode() {

      final int prime = 31;
      int result = 1;
      result = prime * result + ((name == null) ? 0 : name.hashCode());
      return result;
    

    }
    @Override
    public boolean equals(Object obj) {

      if (this == obj)
          return true;
      if (obj == null)
          return false;
      if (!(obj instanceof Course))
          return false;
      Course other = (Course) obj;
      if (name == null) {
          if (other.name != null)
              return false;
      } else if (!name.equals(other.name))
          return false;
      return true;
    

    }

Ecilpse可以自動生成hashcode和equals方法。

判斷元素的索引位置


//通過indexof方法來獲取某元素的索引位置

    if(courseToSelect.contains(course2))
        System.out.println("課程:"+course2.name+"的索引位置為"+courseToSelect.indexOf(course2));
  • indexof(java)從0開始遍歷冈绊,逐個進行equals(java)比較侠鳄,若返回true,得到元素的索引位置死宣。如果有多個重復元素伟恶,返回第一個元素的索引位置
  • lastIndexOf(java)方法與indexof相反,從最后開始遍歷
  • 若沒有找到該元素毅该,這兩個方法都返回-1

判斷map中是否包含指定的key和value值


/*
 * 測試map中博秫,是否包含某個key值或者某個value值
 */
public void testContainsKeyOrValue(){
    System.out.println("請輸入要查詢的學生ID");
    Scanner console = new Scanner(System.in);
    String id = console.next();
    //在map中,用containsKey()方法眶掌,來判斷是否包含某個Key值
    System.out.println("您輸入的學生ID為"+id+"挡育,在學生映射表中是否存在:"+students.containsKey(id));
    if(students.containsKey(id))
        System.out.println("對應的學生為:"+students.get(id).name);
    
    System.out.println("請輸入要查詢的學生姓名:");
    String name = console.next();
    //用containsValue()方法,來判斷是否包含某個Value值
    if(students.containsValue(new Student(null,name)))
        System.out.println("在學生映射表中朴爬,確實包含學生:"+name);
    else{
        System.out.println("在學生映射表中不存在該學生");
    }
    
}

【注】這里的查詢是否包含學生姓名的時候contain方法仍然調用了hashcode和equals方法即寒,所以要在student類中重載兩個方法

應用collection.sort()實現(xiàn)list排序


  • java.util.collections工具類,提供了許多靜態(tài)方法召噩,用來操作集合
  • 用collection.sort()實現(xiàn)list排序

/*

  • 將要完成:
  • 1.通過Collections.sort()方法母赵,對Integer泛型的list進行排序
  • 2.對String泛型的List進行排序
  • 3.對其他類型泛型的list進行排序,以student為例
    */

public class CollectionsTest {

/*
 * 1.通過Collections.sort()方法具滴,對Integer泛型的list進行排序
 * 創(chuàng)建一個Integer泛型的list凹嘲,插入是個100以內不重復的隨機數(shù)
 * 調用Collections.sort()方法排序
 */
public void testSort1(){
    List<Integer> integerList = new ArrayList<Integer>();
    //插入是個100以內不重復的隨機數(shù)
    Random random = new Random();
    Integer k = null;
    for(int i=0;i<10;i++){
        do{
        k = random.nextInt(100);
        }while(integerList.contains(k));
    integerList.add(k);
    System.out.println("成功添加整數(shù):"+k);
    }
    System.out.println("--------排序前-----------");
    for (Integer integer : integerList) {
        System.out.println("元素:"+integer);
    }
    Collections.sort(integerList);
    System.out.println("--------排序后-----------");
    for (Integer integer : integerList) {
        System.out.println("元素:"+integer);
    }
}

/*
 * 2.對String泛型的List進行排序
 * 創(chuàng)建String泛型的list,添加三個亂序的String
 * 調用sort方法构韵,再次輸出排序后的順序
 */

public void testSort2(){
    List<String> stringList = new ArrayList<String>();
    stringList.add("microsoft");
    stringList.add("google");
    stringList.add("eldasdaf");
    System.out.println("--------排序前-----------");
    for (String string : stringList) {
        System.out.println("元素:"+string);
    }
    Collections.sort(stringList);
    System.out.println("--------排序后-----------");
    for (String string : stringList) {
        System.out.println("元素:"+string);
    }
}


/*
 * 3.對其他類型泛型的list進行排序周蹭,以student為例
 */
public void testSort3(){
    //....
    }
}

comparable與comparator接口

image.png
  • comparable默認比較規(guī)則,可比較的疲恢,實現(xiàn)改接口表示:這個類的示例可以bijou大小凶朗。可以進行自然排序冈闭。

public class Student implements Comparable<Student>{

@Override
public int compareTo(Student o) {
    // TODO Auto-generated method stub
    return this.id.compareTo(o.id);
}

public void testSort3(){

    List<Student> studentList = new ArrayList<Student>();
    Random random = new Random();
    studentList.add(new Student(random.nextInt(1000)+"","mike"));
    studentList.add(new Student(random.nextInt(1000)+"","xixo"));
    studentList.add(new Student(random.nextInt(1000)+"","Lan"));
    System.out.println("--------排序前-----------");
    for (Student student : studentList) {
        System.out.println("學生:"+student.id+":"+student.name);
    }
    Collections.sort(studentList);
    System.out.println("--------排序后-----------");
    for (Student student : studentList) {
        System.out.println("學生:"+student.id+":"+student.name);
    }
}
  • comparator 定義臨時比較規(guī)則

public class StudentComparator implements Comparator<Student> {

@Override
public int compare(Student o1, Student o2) {
    // TODO Auto-generated method stub
    return o1.name.compareTo(o2.name);
}

}

public void testSort3(){

    List<Student> studentList = new ArrayList<Student>();
    Random random = new Random();
    studentList.add(new Student(random.nextInt(1000)+"","mike"));
    studentList.add(new Student(random.nextInt(1000)+"","xixo"));
    studentList.add(new Student(random.nextInt(1000)+"","Lan"));
    studentList.add(new Student(10000+"","beyonce"));
            //這里按照姓名排序
    Collections.sort(studentList,new StudentComparator());
    System.out.println("---------按照姓名排序后---------");
    for (Student student : studentList) {
        System.out.println("學生:"+student.id+":"+student.name);
    }
}

總結

image.png

所有類圖

image.png

github地址:Elylicery
https://github.com/Elylicery/Code-Exercise/tree/master/imooc-collection-demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末俱尼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萎攒,更是在濱河造成了極大的恐慌遇八,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耍休,死亡現(xiàn)場離奇詭異刃永,居然都是意外死亡,警方通過查閱死者的電腦和手機羊精,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門斯够,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事读规∽ザ剑” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵束亏,是天一觀的道長铃在。 經常有香客問我,道長碍遍,這世上最難降的妖魔是什么定铜? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮怕敬,結果婚禮上揣炕,老公的妹妹穿的比我還像新娘。我一直安慰自己东跪,他們只是感情好畸陡,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著越庇,像睡著了一般罩锐。 火紅的嫁衣襯著肌膚如雪奉狈。 梳的紋絲不亂的頭發(fā)上卤唉,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音仁期,去河邊找鬼桑驱。 笑死,一個胖子當著我的面吹牛跛蛋,可吹牛的內容都是我干的熬的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼赊级,長吁一口氣:“原來是場噩夢啊……” “哼押框!你這毒婦竟也來了?” 一聲冷哼從身側響起理逊,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤橡伞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晋被,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兑徘,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年羡洛,在試婚紗的時候發(fā)現(xiàn)自己被綠了挂脑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖崭闲,靈堂內的尸體忽然破棺而出肋联,到底是詐尸還是另有隱情,我是刑警寧澤刁俭,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布牺蹄,位于F島的核電站,受9級特大地震影響薄翅,放射性物質發(fā)生泄漏沙兰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一翘魄、第九天 我趴在偏房一處隱蔽的房頂上張望鼎天。 院中可真熱鬧,春花似錦暑竟、人聲如沸斋射。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罗岖。三九已至,卻和暖如春腹躁,著一層夾襖步出監(jiān)牢的瞬間桑包,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工纺非, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哑了,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓烧颖,卻偏偏與公主長得像弱左,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炕淮,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351