-
2014-08-07 15:59:17
按照字典排序,就是按照从小大排序,包括序号中的每一个数字。
例如输入3,字典排序就是
1,2,3, 1,3,2, 2,1,3, 2,3,1, 3,1,2, 3,2,1,
对于1,2,3和1,3,2来说,显然除了第一个是1外,1后面也按照字典排序。于是题目就是:输入一个n(1-9),生成最大数为n的字典排序
思路:从题目分析可以看出,应该使用递归的方法。假设我们已经确定了前k个数字,后面的数字也是要按字典排序,将前k个数字,与后面数字的字典排序结合起来,就可以得出结果。按照递归的思路,我们假设我们已经拥有了一个print_permutation(int n,int[] a,int cur)方法,这个方法第一个参数是我们输入的n,第二个参数是已经按照字典排序拍好的cur个数字,cur就是a里面有多少个数字已经按字典排序拍好
假设n=9,那么我们拿着这个方法,我确定第一位,是从1到9,然后可以调用print_permutation(8,arr,0),就可以生产后面八位。
那么要几时print_permutation(8,arr,0),也就是n=8,我们同样确定第一位(注意,这里的第一位不能等于n=9时确定的第一位,所以程序里面加了加个判断),然后调用
print_permutation(7,arr,0)
以此类推,我们最后调用print_permutation(1,arr,0)就可以结束递归
public class Test { public static void print_permutation(int n,int[] a,int cur){ if(cur == n){//如果当前数目为总数,输出 for(int i=1;i<n;i++){ System.out.print(a[i]+","); } System.out.println(); }else{ for(int i=1;i<n;i++){//逐个查找数字 boolean OK = true;; for(int j=1;j<cur;j++){//判断数字是否已经在序列中 if(i == a[j]){ OK = false; break; } } if(OK){//如果不在序列中 a[cur] = i;//将数字加入序列 print_permutation(n, a, cur+1);//递归调用 } } } } public static void main(String[] args) { int total = 3; int[] arr = new int[total+1]; print_permutation(total+1, arr, 0); } }
更多相关内容 -
Java利用Redis实现消息队列的示例代码
2020-08-29 22:06:41本篇文章主要介绍了Java利用Redis实现消息队列的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
java实现消息队列的两种方式(小结)
2020-08-26 14:58:30本文主要介绍了两种java实现消息队列的方式,利用Spring消息模板发送消息和Apache ActiveMQ官方实例发送消息,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
rabbitmq根据配置文件动态生成队列
2019-03-23 17:54:12支持配置文件动态生成队列,创建交换器,根据配置好的对应关系绑定队列和交换器 -
Factotum:基于命令模式的 Java 异步任务队列。 利用代码生成减少样板类定义
2021-06-22 00:00:54基于Java 异步任务队列。 利用代码生成减少样板类定义。 使用 Factotum 定义任务和请求 创建一个具有默认零参数构造函数的非抽象类。 在这个类中创建一个包含将异步运行的代码的方法。 package com.example; ... -
1、利用Java的集合类实现队列(Queue)的一种方式
2019-04-27 09:10:01在Java中通过集合实现Queue(队列): package QueueLearn; import java.util.ArrayList; import java.util.List; //2.使用集合实现队列功能,使用int数组保存数据特点:先进先出,后进后出 public class QueueText02...在Java中通过集合实现Queue(队列):
package QueueLearn; import java.util.ArrayList; import java.util.List; //2.使用集合实现队列功能,使用int数组保存数据特点:先进先出,后进后出 public class QueueText02 { public static void main(String[] args){ System.out.println("测试队列"); Queue02 queue = new Queue02(); queue.in(1); queue.in(2); queue.in(3); System.out.println(queue.out()); System.out.println(queue.out()); queue.in(4); System.out.println(queue.out()); System.out.println(queue.out()); queue.in(5); System.out.println(queue.out()); } } //使用集合定义一个队列 class Queue02{ // <Integer>实现将int转换为一个对象类型 // // int类型是放在栈空间的,Integer是作为对象放在堆空间的; // // int 是基本类型,不是类,为了符合面向对象编程,后来出现了Integer 类,他是对int进行封装的。 // // int不是对象,是java原始的数据类型,它默认值为0。 // // Integer是个对象,它有自己的方法,默认值为NULL。 List<Integer> list = new ArrayList<Integer>(); int index=0; //下标 //入队 public void in(int n){ list.add(n); index++; } //出队 public int out(){ //判断list是否为空 if(!list.isEmpty()){ index--; return list.remove(0); } return -1; } }
如果想对对集合有个更加深入的了解,可以看这一篇文章:用 Java 数组来实现 ArrayList 集合 http://www.cnblogs.com/ysocean/p/6812674.html
结果显示:
-
java复制队列
2020-04-04 17:56:51队列头文件: import java.util.Queue; import java.util.LinkedList; 定义队列: Queue<Integer> queue = new LinkedList<Integer>(); 复制队列: 方法一 queue.addAll(queue2) /** * Removes all...队列头文件:
import java.util.Queue; import java.util.LinkedList;
定义队列:
Queue<Integer> queue = new LinkedList<Integer>();
复制队列:
方法一
queue.addAll(queue2)
/** * Removes all of this collection's elements that are also contained in the * specified collection (optional operation). After this call returns, * this collection will contain no elements in common with the specified * collection. * /
根据官方的解释已经很明确了,这里queue是添加了queue2的所有值,并且queue里面如果原来有值则会全部删除,可以实现复制操作。
方法二
Queue<Integer> queue = new LinkedList<Integer>(queue2);
直接通过队列的构造函数生成新的队列,这也实现了队列的拷贝
看完不点个赞也太过分了吧!!!
-
handBrakeQueueTool:生成手刹队列xml文件
2021-05-02 03:10:58#1打开Eclipse#2下载唯一的Java文件(或加载git项目)#3更新Java文件中的视频路径#4运行它#5将在您指定的文件夹中生成所需的队列xml文件。 #6准备加载到手刹视频压缩软件(队列)中。 随意将其转换为Java ... -
java实现RabbitMQ消息队列
2022-04-19 10:43:27MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。目录
一、什么是MQ?
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。
MQ相关核心部分
核心部分,分为6大部分 1、简单模式(simple) 2、工作模式(Work queues) 3、发布订阅模式(Publish/Subscribe) 4、路由模式(Routing) 5、主题模式(Topics) 6、发布确认模式(Publisher Confirms) 高级部分 1、死信队列 2、延迟队列 3、发布确认高级 a、发布确认 b、回退消息 c、备份交换机 4、冥等性 5、优先级队列 6、惰性队列 集群部分 1、Clustering 2、镜像队列 3、HAProxy + Keepalive实现高可用负载均衡 4、Federation Exchange 5、Federation Queue 6、Shovel
二、为什么要用MQ?
-
流量消锋
-
应用解耦
-
异步处理
三、MQ分类和使用场景
名称 场景 ActiveMQ Kafka 大公司、大数据 RocketMQ 金融、互联网、双11 RabbitMQ 高并发,中小企业
MQ关系图如下:四、安装MQ
1、准备工作
这里通过官网下载需要的版本:RabbitMQ官方网址
百度云下载:
otp_win64_24.3.3
链接:https://pan.baidu.com/s/1pY5KA9jrtQoQQ7-0_kslaQ?pwd=6666
提取码:6666rabbitmq-server-3.8.16
链接:https://pan.baidu.com/s/1ts21fmA8cYRbLw76nK8Vvw?pwd=6666
提取码:6666进入官网向下拉,找到 Download + Installation 下载+安装,点击进入。
在新页面找到右侧,Install Windows 安装windows版本
然后页面下拉,找到 Dependencies 依赖关系
选择otp_win64_24.1.7.exe 我的系统是64位的,所以下载win64
这里笔者强调一下。我安装的是最新版本。如果你们觉得最新版可能存在未知bug或不兼容问题,可以选择自己想要下载的对应版本即可。
这里我截图一部分版本参照表,其他的可以自行查看
2、开始安装
第一步:找到我们下载的软件位置。
第二步:先安装otp_win64_24.1.7.exe第三步:鼠标右键以管理员方式运行
第四步:接着选取要安装的路径,然后一路傻瓜式安装 next 下一步,安装即可。
【注意】不要安装在中文或带空格的文件路径下
第五步:配置系统环境变量
右键此电脑 - 属性 - 高级系统设置 - 环境变量
接着打开 - 此电脑(文件资源管理器) 找到刚刚我们安装的 erl - 24.1.7 文件 bin 目录下,复制路径 ctrl+c
切换窗口到环境变量,找到系统变量 path - 编辑
新建 - ctrl + v 粘贴刚才我们复制的路径,然后三次确定,关闭环境变量窗口
第六步:安装 RabbitMQ
右键管理员运行,然后选择安装路径,接着一路 next 下一步,遇到弹窗点允许,没有弹窗则无视。
【注意】不要安装在中文或带空格的文件路径下第七步:安装完成后找到安装文件路径,找到 sbin 目录下,全选路径 输入 cmd
打开cmd命令窗口。
运行下面命令,回车运行。
rabbitmq-plugins enable rabbitmq_management
第八步:打开任务资源管理器。win11 快捷键 Ctrl+Shift+Esc,找到rabbitmq服务右键重新启动。
3、结束安装
打开浏览器。访问 http://127.0.0.1:15672
出现管理页面:
账号:guest
密码:guest
登录成功后。进入下面页面即代表安装成功。至此大功告成。是不是很简单!如果不小心安装到中文或带空格路径文件路径下,这个链接可以解决:
https://blog.csdn.net/leoma2012/article/details/97636859如果想要彻底卸载RabbitMQ,则访问这个链接:
https://blog.csdn.net/qq_41463655/article/details/86747917
安装原文链接:https://blog.csdn.net/tirster/article/details/121938987五、实践操作:
首先pom.xml引入依赖
<!-- MQ客户端 --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.8.0</version> </dependency> <!-- 文件读取 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
一、简单模型(simple)
就是一个生产者一个消费者,中间通过一个队列直接连接。
1、创建生产者,发消息,创建Producer.class文件
public static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException { // 创建一个连接工厂 ConnectionFactory factory = new ConnectionFactory(); // 工厂IP,连接RabbitMQ的队列 factory.setHost("127.0.0.1"); // 用户名 factory.setUsername("guest"); // 密码 factory.setPassword("guest"); // 创捷连接 Connection connection = factory.newConnection(); // 创建信道 Channel channel = connection.createChannel(); /** * 生成一个队列 * 1、队列名称 * 2、队列里面的消息是否持久化,默认情况消息存储再内存中,设置true保存磁盘中 * 3、该队列是否只供一个消费者消费,true可以多个消息者消费,false只能一个 * 4、是否自动删除,ture自动删除,false不自动删除 * 5、其他参数 */ channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 发消息 String message = "hello word"; /** * 发送一个消费 * 1、发送到那个交换机 * 2、路由的key值是那个 ,本次是队列的名称 * 3、其他参数 * 4、发送消息的消息体 */ channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); }
2、消费者,接收消息,Consumer.class文件
// 队列的名称 public static final String QUEUE_NAME = "hello"; // 接收消息 public static void main(String[] args) throws IOException, TimeoutException { // 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); // 工厂IP,连接RabbitMQ的队列 factory.setHost("127.0.0.1"); // 用户名 factory.setUsername("guest"); // 密码 factory.setPassword("guest"); // 创捷连接 Connection connection = factory.newConnection(); // 创建信道 Channel channel = connection.createChannel(); // 消费者未成功的回调 DeliverCallback deliverCallback = (consumerTag, message) -> System.out.println("接收到的消息" + new String(message.getBody())); // 消费者取消消费的回调 CancelCallback cancelCallback = consumerTag -> System.out.println("消息中断"); /** * 1、消费那个队列 * 2、消费成功后是否自动确认 * 3、消费者未成功的回调 * 4、消费者取消消费的回调 */ channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback); }
二、工作模式(work queues)
就是有多个消费者消费队列里的消息,队列里的消息只能被一个消费者消费,这样多部署几个消费者,就可以缓解压力,比如过年的时候抢票,抢票成功后会给你发短信,这个时候就可以把发短信的任务放入队列里,然后有多个发短信的服务来处理队列里的任务。
注意事项:一个消息只能被处理一次,不可以处理多次,需要采用轮训处理
1、创建工具类RabbitMqUtils.class,后面创建信道使用工具类
public class RabbitMqUtils { /** * 创建信道工具方法 * * @return * @throws Exception */ public static Channel getChannel() throws Exception { // 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); // 工厂IP,连接RabbitMQ的队列 factory.setHost("127.0.0.1"); // 用户名 factory.setUsername("guest"); // 密码 factory.setPassword("guest"); // 创捷连接 Connection connection = factory.newConnection(); // 创建信道 return connection.createChannel(); } }
2、创建工作线程Work.class文件
public class Work01 { // 队列名称 public static final String QUEUE_NAME = "hello"; //接收消息 public static void main(String[] args) throws Exception { Channel channel = RabbitMqUtils.getChannel(); // 消息的接收 DeliverCallback deliverCallback = (consumerTag, message) -> System.out.println("接 收到的消息" + new String(message.getBody())); // 消费者取消消费的回调 CancelCallback cancelCallback = consumerTag -> System.out.println("消息中断"); /** * 1、消费那个队列 * 2、消费成功后是否自动确认 * 3、消费者未成功的回调 * 4、消费者取消消费的回调 */ System.out.println("C1等待消息...."); channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback); } }
备注:依次类推,创建多个work线程文件 ,或者多次执行work01方法,创建多个线程
3、创建发送消息文件Task01.class
public class Task01 { // 队列名称 public static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception { Channel channel = RabbitMqUtils.getChannel(); /** * 队列声明 * 生成一个队列 * 1、队列名称 * 2、队列里面的消息是否持久化,默认情况消息存储再内存中,设置true保存磁盘中 * 3、该队列是否只供一个消费者消费,true可以多个消息者消费,false只能一个 * 4、是否自动删除,ture自动删除,false不自动删除 * 5、其他参数 */ channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 从控制台当中接收信息 Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String message = scanner.next(); /** * 发送一个消费 * 1、发送到那个交换机 * 2、路由的key值是那个 ,本次是队列的名称 * 3、其他参数 * 4、发送消息的消息体 */ channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println("发送完成"); } } }
发送完,后台接收到信息
三、发布订阅模式(Publish/Subscibe)
上面两种模式生产者的消息只能被一个消费者消费,不符合某些实际场景。
假如我们有一个国家气象局天气预报系统,这个时候他发送消息,其他的服务商,比如百度、网易、腾讯等公司都要从国家天气预报系统那里获取天气怎么办呢?
总不能百度获取了今天的天气其他公司就获取不了天气了吧,或者让国家天气预报系统给每个服务商都发送一次消息,那样显然是很麻烦的。
所以我们需要用到一个Exchange交换机角色来帮助我们把消息发给所有订阅我们的服务商。
四、路由模式 (Routing)
路由模式就是交换机并不是给所有订阅他的队列发送消息了,而是根据路由键来确定应该给哪个队列发送消息,队列和交换机绑定的时候需要通过路由键,而生产者发送消息的时候也需要指定路由键,这样就可以确定给哪个队列发送消息了。
这里我们可以看到是给张三发送消息,所以只会给路由键为张三的那个队列发送消息。
五、主题模式(Topics)
主题模式就相当于模糊匹配,假如我想给姓张的发送消息,那么我就可以通过主题模式给所有姓张的发送消息。
-
-
java线程池常用的阻塞队列
2020-07-22 16:46:03由于多线程同时从任务队列中获取任务是并发场景,此时就需要任务队列满足线程安全的要求,所以线程池中任务队列采用 BlockingQueue 来保障线程安全. 表格左侧是线程池,右侧为它们对应的阻塞队列,可以看到 5 种... -
java优先级队列使用
2019-02-21 21:40:11优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适的位置保证队列有序。举个例子来说,一组整型数,如果使用优先级队列的话,不管队列之前放入的数据如何,后面添加进去的数据总会被按照升序... -
java 中 阻塞队列 非阻塞队列 和普通队列的区别
2018-08-22 23:14:26阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列... -
Java 优先级队列
2018-10-13 23:35:01队列(queue)是一种先入先出(FIFO)的数据结构。 栈中的插入和移除数据项的命名一般都是Push、Pop,而队列至今...在 Java 中,常见的队列操作以及它们的区别如下所示: 插入 offer 向队列插入元素,在一... -
java实现消息队列以及延迟消息(队列DelayQueue)
2021-02-26 10:10:001.java实现延迟消息(队列DelayQueue) DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。... -
Java生成有规则的编号
2021-03-16 00:02:18目录第一种方法:第二种方法:思路第三种方法:redis推荐三种方法比较:做订单、出入库单等等数据时,往往需要自动生成有一定规则的编号。编号格式为:两个字母+日期(8位)+编号(3位)。第一种方法:其中,日期为系统... -
利用随机函数产生10个1~100之间的整数,按从小到大的顺序排列输出
2021-03-15 13:30:25该楼层疑似违规已被系统折叠隐藏此楼查看此楼publicinterfaceplaneGraphics2{publicabstractdoublearea();publicabstractdoubleperimeter();publicabstractvoidprint();}publicclassrectangle2... -
创建一个自己的队列
2021-03-11 13:49:19写在前面本系列代码Gitee地址为点击这里接口 Queue.javapublic interface Queue {// 入队void enqueue(E e);// 出队E dequeue();// 获取队首元素E getFront();// 获取队列大小int getSize();// 判断队列是否为空... -
聊聊Java中的并发队列中 有界队列和无界队列的区别
2018-08-20 23:02:01本文主要总体的说一说各种并发队列 首先来一张全体照 从有界无界上分 常见的有界队列为 ArrayBlockingQueue 基于数组实现的阻塞队列 LinkedBlockingQueue 其实也是有界队列,但是不设置大小时就时Integer.... -
JAVA线程池中队列与池大小的关系
2021-02-26 16:58:27JAVA线程池中队列与池大小的关系JAVA线程中对于线程池(ThreadPoolExecutor)中队列,池大小,核心线程的关系写出自己的理解:1:核心线程:简单来讲就是线程池中能否允许同时并发运行的线程的数量2:线程池大小:... -
Java中的队列都有哪些,有什么区别?
2021-02-12 11:07:481.BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类:2.ArrayBlockingQueue:基于数组结构的有界阻塞队列,规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。... -
Java优先队列(PriorityQueue)
2018-11-10 11:28:36我们知道队列是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在队列中基于优先级处理对象。举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间。... -
两个队列实现一个栈(Java)
2019-03-28 09:30:541、一个队列加入元素,弹出元素时,需要把队列中的 元素放到另外一个队列中,删除最后一个元素 2、两个队列始终保持只有一个队列是有数据的 代码: package com.datastructure.stackqueue; import java.util.... -
《操作系统之Java实现模拟多级反馈队列进程调度(带GUI)》
2018-05-24 12:34:591. 进程控制块类 2. 控制块队列类 3. 多级反馈队列进程调度模拟类 五、相关说明 不得不说,利用IDEA的GUI Form对Swing的支持,使得我们可以直接在一个没有父类的(也就是不用继承JFrame)的普通类... -
Java架构之消息队列 (一):消息队列的概述
2018-10-08 16:09:38消息队列系列分享大纲: 一、消息队列的概述 ...1.消息队列的概述 消息队列(Message Queue)中间件是分布式系统中重要的组件; 主要解决应用耦合,异步消息,流量削锋等问题; 实现... -
Java线程安全的有序阻塞队列PriorityBlockingQueue
2019-08-27 23:30:25import java.util.Comparator; import java.util.Iterator; import java.util.concurrent.PriorityBlockingQueue;... * PriorityBlockingQueue是阻塞式的Java线程安全队列。 */ public class Mai... -
Java-rabbitmq延时队列的实现(延时消费&延时重试)
2019-10-16 18:28:25B站:code_ant(java相关培训视频) 写在前面 阅读该部分的代码以及文章,必须了解的知识有: 搭建安装好rabbitmq - server rabbitmq 四种路由规则中的三种(direct、topic、fanout) 简述 本文代码地址:... -
java实现消息队列的两种方式
2018-02-05 11:05:41实现消息队列的两种方式 Apache ActiveMQ官方实例发送消息...下载解压后拿到java代码实例 然后倒入IDE 如下: 请认真阅读readme.md文件,大致意思就是把项目打成两个jar包,然后启动服务,然后同时运行打的两 -
Java中阻塞队列的使用
2019-03-17 15:42:19在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。...认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如... -
Java中的阻塞队列(BlockingQueue)
2018-07-17 22:28:09本文转自:Java中的阻塞队列(BlockingQueue) 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附加操作:当队列... -
MultiLevel-Queue-Scheduling-Algorithm:多级队列调度算法是在高级Java编程语言的帮助下设计的
2021-05-16 04:15:24通过考虑每个进程的优先级,等待时间和突发时间来复制多级队列调度过程,并生成生成的Gant图表以及平均等待时间和完成时间。 整个算法是用Java编程语言设计的,其中一个队列使用FCFS算法,而另一个队列使用循环算法...