Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 激情亚洲的在线观看,日本在线一区二区,日本一级全黄大片

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          統計列表(list)中每個元素出現的次數


          題描述:

          languages = ['python', 'java', 'python', 'c', 'c++', 'go', 'c#', 'c++', 'lisp', 'c', 'javascript', 'java', 'python', 'matlab', 'python', 'go', 'java']

          解決方案

          統計結果為element:count的形式,統計結果采用dict從左到右一次遍歷list中元素,判斷是否在dict中,如果不在則將element存入dict并設置count為1,否則將dict中element對應的count加1后再存儲到dict中

          #encoding:utf-8
          languages = ['python', 'java', 'python', 'c', 'c++', 'go', 'c#', 'c++', 'lisp', 'c', 'javascript', 'java', 'python', 'matlab', 'python', 'go', 'java']
          
          stat={}
          
          for language in languages:
          	if language not in stat:
          		stat[language]=1
          	else:
          		stat[language]+=1
          print(stat)
          ————————————————
          版權聲明:本文為CSDN博主「lumangnote」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
          原文鏈接:https://blog.csdn.net/Filme/java/article/details/84882447

          運行結果:

          這一篇文章將講述Redis中的list類型命令,同樣也是通過demo來講述,其他部分這里就不在贅述了。

          項目Github地址:https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-list

          案例

          demo功能是隊列,整個demo的大致頁面如下。左邊是存儲到Redis中的數據,右邊是從Redis中彈出的數據。

          準備工作

          首先定義一個存儲list的key

          private static final String LIST_KEY = "list:1";
          

          隊列的key就用list:1

          redis操作對象

          private RedisTemplate redisTemplate;
          //string 命令操作對象
          private ValueOperations valueOperations;
          //list 命令操作對象
          private ListOperations listOperations;
          

          list在Redis中的結構可以看下圖(圖片來源于Redis in Action)。

          插入數據

          頭部插入

          命令介紹

          命令用例描述LPUSHLPUSH key value [value ...]將所有指定的值插入到存于 key 的列表的頭部。 如果 key 不存在,那么在進行 push 操作前會創建一個空列表。LPUSHXLPUSHX key value只有當 key 已經存在并且存著一個 list 的時候,在這個 key 下面的 list 的頭部插入 value。

          接下來看看demo中頭部插入的功能,點擊下圖中頭部插入按鈕,然后在彈出框中填入數字0,點擊提交后整個頭部插入流程結束。可以看到左邊的隊列數據出現了一條{"data":"0"} 數據,在數據{"data":"1"} 上面。

          來看看后臺的方法

          @RequestMapping(value = "/leftPop",method = RequestMethod.GET)
          public Object leftPop(){
           return listOperations.leftPop(LIST_KEY);
          }
          

          如果需要在Redis中操作,可以敲下面的命令

          lpush list:1 "{\"data\":\"0\"}" 
          

          尾部插入

          命令介紹

          命令用例描述RPUSHRPUSH key value [value ...]向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么會創建一個空的列表然后再進行 push 操作。RPUSHXRPUSHX key value將值 value 插入到列表 key 的表尾, 當且僅當 key 存在并且是一個列表。

          接下來看看demo中尾部插入的功能,點擊下圖中尾部插入按鈕,然后在彈出框中填入數字11,點擊提交后整個新增流程結束??梢钥吹阶筮叺年犃袛祿霈F了一條{"data":"11"} 數據,在數據{"data":"10"}下面。

          來看看后臺的方法

          @RequestMapping(value = "/rightPop",method = RequestMethod.GET)
          public Object rightPop(){
           return listOperations.rightPop(LIST_KEY);
          }
          

          如果需要在Redis中操作,可以敲下面的命令

          rpush list:1 "{\"data\":\"11\"}" 
          

          列表查詢

          命令介紹

          同樣先看看相關的獲取值命令

          命令用例描述LRANGELRANGE key start stop返回存儲在 key 的列表里指定范圍內的元素。LINDEXLINDEX key index返回列表里的元素的索引 index 存儲在 key 里面。LLENLLEN key返回存儲在 key 里的list的長度。

          后臺查詢方法,將新增的內容查詢出來

          @RequestMapping(value = "/getList",method = RequestMethod.GET)
          public List getList(){
           List list = listOperations.range(LIST_KEY, 0, -1);
           //可以用size獲取成員長度
           //listOperations.size(LIST_KEY);
           return list;
          }
          

          數據彈出

          頭部彈出

          命令用例描述LPOPLPOP key移除并且返回 key 對應的 list 的第一個元素。BLPOPBLPOP key [key ...] timeout它是命令 LPOP 的阻塞版本,這是因為當給定列表內沒有任何元素可供彈出的時候, 連接將被 BLPOP 命令阻塞。

          接下來看看頭部彈出的功能,點擊下圖中頭部彈出按鈕,可以看到左邊的隊列頂部數據減少了,在右邊彈出的數據出現了左邊隊列數據消失的數據。

          來看看后臺的方法

          @RequestMapping(value = "/leftPop",method = RequestMethod.GET)
          public Object leftPop(){
           return listOperations.leftPop(LIST_KEY);
          }
          

          如果需要在Redis中操作,可以敲下面的命令

          lpop list:1 
          

          尾部彈出

          命令用例描述RPOPRPOP key移除并返回存于 key 的 list 的最后一個元素。BRPOPBRPOP key [key ...] timeout它是 RPOP 的阻塞版本,因為這個命令會在給定list無法彈出任何元素的時候阻塞連接。

          接下來看看尾部彈出的功能,點擊下圖中尾部彈出按鈕,可以看到左邊的隊列尾部數據減少了,在右邊彈出的數據出現了左邊隊列數據消失的數據。

          來看看后臺的方法

          @RequestMapping(value = "/rightPop",method = RequestMethod.GET)
          public Object rightPop(){
           return listOperations.rightPop(LIST_KEY);
          }
          

          如果需要在Redis中操作,可以敲下面的命令

          rpop list:1 
          

          其他命令

          命令用例描述LINSERTLINSERT key BEFORE\AFTER pivot value把 value 插入存于 key 的列表中在基準值 pivot 的前面或后面。LREMLREM key count value從存于 key 的列表里移除前 count 次出現的值為 value 的元素。LSETLSET key index value設置 index 位置的list元素的值為 value。LTRIMLTRIM key start stop修剪(trim)一個已存在的 list,這樣 list 就會只包含指定范圍的指定元素。RPOPLPUSHRPOPLPUSH source destination原子性地返回并移除存儲在 source 的列表的最后一個元素(列表尾部元素), 并把該元素放入存儲在 destination 的列表的第一個元素位置(列表頭部)。BRPOPLPUSHBRPOPLPUSH source destination timeoutBRPOPLPUSH 是 RPOPLPUSH 的阻塞版本。

          RPOPLPUSH和BRPOPLPUSH

          這兩個命令作用其實是相同的,只不過BRPOPLPUSH是阻塞的,當沒有數據時,會一直阻塞,直到有數據。

          在Redis官方文檔中,用RPOPLPUSH命令舉了兩個例子,一個是Reliable queue(安全的隊列 ),另一個是Circular list(循環列表)。

          Reliable queue(安全的隊列 )

          Redis通常都被用做一個處理各種后臺工作或消息任務的消息服務器。 一個簡單的隊列模式就是:生產者把消息放入一個列表中,等待消息的消費者用 RPOP 命令(用輪詢方式), 或者用 BRPOP 命令(如果客戶端使用阻塞操作會更好)來得到這個消息。

          然而,因為消息有可能會丟失,所以這種隊列并是不安全的。例如,當接收到消息后,出現了網絡問題或者消費者端崩潰了, 那么這個消息就丟失了。

          RPOPLPUSH (或者其阻塞版本的 BRPOPLPUSH) 提供了一種方法來避免這個問題:消費者端取到消息的同時把該消息放入一個正在處理中的列表。 當消息被處理了之后,該命令會使用 LREM 命令來移除正在處理中列表中的對應消息。

          另外,可以添加一個客戶端來監控這個正在處理中列表,如果有某些消息已經在這個列表中存在很長時間了(即超過一定的處理時限), 那么這個客戶端會把這些超時消息重新加入到隊列中。

          翻譯來自 http://www.redis.cn/commands/rpoplpush.html

          Circular list(循環列表)

          RPOPLPUSH 命令的 source 和 destination 是相同的話, 那么客戶端在訪問一個擁有n個元素的列表時,可以在 O(N) 時間里一個接一個獲取列表元素, 而不用像 LRANGE那樣需要把整個列表從服務器端傳送到客戶端。

          上面這種模式即使在以下兩種情況下照樣能很好地工作: 有多個客戶端同時對同一個列表進行旋轉(rotating):它們會取得不同的元素,直到列表里所有元素都被訪問過,又從頭開始這個操作。 有其他客戶端在往列表末端加入新的元素。

          這個模式讓我們可以很容易地實現這樣一個系統:有 N 個客戶端,需要連續不斷地對一批元素進行處理,而且處理的過程必須盡可能地快。 一個典型的例子就是服務器上的監控程序:它們需要在盡可能短的時間內,并行地檢查一批網站,確保它們的可訪問性。

          值得注意的是,使用這個模式的客戶端是易于擴展(scalable)且安全的(reliable),因為即使客戶端把接收到的消息丟失了, 這個消息依然存在于隊列中,等下次迭代到它的時候,由其他客戶端進行處理。

          翻譯來自 http://www.redis.cn/commands/rpoplpush.html

          案例-約瑟夫問題

          約瑟夫問題(有時也稱為約瑟夫斯置換),是一個出現在計算機科學和數學中的問題。在計算機編程的算法中,類似問題又稱為約瑟夫環。

          人們站在一個等待被處決的圈子里。 計數從圓圈中的指定點開始,并沿指定方向圍繞圓圈進行。 在跳過指定數量的人之后,執行下一個人。 對剩下的人重復該過程,從下一個人開始,朝同一方向跳過相同數量的人,直到只剩下一個人,并被釋放。

          問題即,給定人數、起點、方向和要跳過的數字,選擇初始圓圈中的位置以避免被處決。

          來自維基百科 https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98

          思路

          定義一個list key為josephus,利用

          RPOPLPUSH josephus josephus
          

          命令來構造循環鏈表,每當數到3時,使用rpop

          rpop josephus
          

          命令彈出

          代碼實現

          public class JosephusProblem extends RedisBaseConnection {
           @Test
           public void test() {
           //構造數據
           for (int i = 1; i <= 41; i++) {
           listOperations.leftPush("josephus", String.valueOf(i));
           }
           int index = 1;
           while (listOperations.size("josephus") > 0) {
           //當數到3時,彈出
           if (index == 3) {
           System.out.println(listOperations.range("josephus", 0, -1));
           System.out.println("當前被殺的人是:" + listOperations.rightPop("josephus"));
           index = 0;
           } else {
           listOperations.rightPopAndLeftPush("josephus", "josephus");
           }
           index++;
           }
           }
          }
          

          整個代碼步驟如下

          1. 先是模擬有41個人(向redis中key為josephus的list添加41個數據)
          2. 定義索引index
          3. 循環判斷key為josephus的數據長度是否大于0
          4. 當索引index為3時,調用Redis的rpop命令彈出對應的數據。索引index不為3時,調用RPOPLPUSH命令,將對應的數據放到隊列頭部
          5. 索引index加1

          運行結果有點長,這里只截圖最后一部分的結果,如下

          約瑟夫問題代碼請點擊JosephusProblem.java


          建議學習的人最好每個命令都去敲下,加深印象。下面詩句送給你們。

          紙上得來終覺淺,絕知此事要躬行。————出自《冬夜讀書示子聿》

          作者:勿妄

          備工作:使用靜態塊初始化List數據

          private static List<Integer> list;	
          //靜態塊 ==> 初始化ArrayList
          static {
            list = new ArrayList<>(10);
            for(int index = 1; index <= 10; index++) {
              list.add(index);
            }
          }	

          1.普通while循環遍歷

          public static void test1() {
            System.out.println("第一種方式:普通while循環遍歷List集合");
            int index = 0;
            while(index < list.size()) {
              System.out.println(list.get(index));
              index++;
            }
          }

          2.普通do...while循環遍歷

          public static void test2() {
            System.out.println("第二種方式:普通do...while循環遍歷List集合");
            int index = 0;
            do{
              System.out.println(list.get(index));
              index++;
            }while(index < list.size());
          }

          3.普通for循環遍歷

          public static void test3() {
            System.out.println("第三種方式:普通for循環遍歷List集合");
            for (int index = 0; index < list.size(); index++) {
              System.out.println(list.get(index));
            }
          }

          4.增強for循環遍歷

          public static void test4() {
            System.out.println("第四種方式:增強for循環遍歷List集合");
            for (int element : list) {
              System.out.println(element);
            }
          }

          5.Iterator迭代器循環遍歷

          public static void test5() {
            System.out.println("第五種方式:Iterator迭代器循環遍歷List集合");
            Iterator<Integer> it = list.iterator();
            while(it.hasNext()) {
              System.out.println(it.next());
            }
          }

          6.ListIterator迭代器循環遍歷

          public static void test6() {
            System.out.println("第六種方式:ListIterator迭代器循環遍歷List集合");
            Iterator<Integer> it = list.listIterator();
            while(it.hasNext()) {
              System.out.println(it.next());
            }
          }

          7.Lambda表達式遍歷(jdk1.8+)

          public static void test7() {
            System.out.println("第七種方式:Lambda表達式遍歷List集合");
            list.forEach(element -> System.out.println(element));
            list.forEach(System.out::println);//方法參考引用
          }

          8.Stream流 + Lambda表達式(jdk1.8+)

          public static void test8() {
            System.out.println("第八種方式:Stream流 + Lambda表達式遍歷List集合");
            //單線程順序流 ==> 先過濾后遍歷
            list.stream().filter(element -> element % 2 == 0).forEach(System.out::println);
            //多線程并行流 ==> 先過濾后遍歷
            list.parallelStream().filter(element -> element % 2 == 0).forEach(System.out::println);
          }

          至此搞定,java循環遍歷List集合就這么簡單,小伙伴們不妨試試。


          主站蜘蛛池模板: 国产精品视频一区二区三区无码| 免费无码一区二区三区| 亚洲精品国产suv一区88| 国产一区二区三区免费视频| 亚洲一区二区电影| 成人无码一区二区三区| 日韩免费视频一区| 中文字幕av人妻少妇一区二区| 熟女性饥渴一区二区三区| 动漫精品一区二区三区3d| 日本一区二区三区不卡视频| 亚洲国产一区二区a毛片| 国产精品免费一区二区三区四区| 国产精品 一区 在线| 国产女人乱人伦精品一区二区 | 日韩av片无码一区二区不卡电影| 亚洲国产精品乱码一区二区 | 亚洲国产精品综合一区在线 | 女女同性一区二区三区四区| 国产精品特级毛片一区二区三区| 美女啪啪一区二区三区| 久久人妻内射无码一区三区| 精品一区二区三区四区| 秋霞午夜一区二区| 骚片AV蜜桃精品一区| 91福利一区二区| 中文字幕在线不卡一区二区| 一区二区三区精密机械| 人妻在线无码一区二区三区| 人妻av综合天堂一区| 日本免费一区尤物| 一区二区精品在线观看| 亚洲爽爽一区二区三区| 手机看片一区二区| 无码人妻一区二区三区免费看| 色窝窝无码一区二区三区色欲| 久久综合精品不卡一区二区| 91精品福利一区二区| 精品国产一区二区三区在线| 国产精品福利一区| 亚洲一区AV无码少妇电影☆|