Java语言一旦确定了字典的键值以后,如果还要添加相同的数据,怎么实现数据的交换?代码没有思路怎么办,求问?
你还可以用我刚刚说的multiset类,思路就是判断出现的次数,出现过就放到一个专门存重复元素的列表,这是官方给的一个案例:
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class DuplicateDictionary {
public static void main(String[] args) throws IOException {
String filename = "dictionary.txt";
Multiset<String> words = HashMultiset.create();
List<String> duplicates = new ArrayList<>();
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line;
while ((line = reader.readLine()) != null) {
words.add(line);
if (words.count(line) > 1) {
duplicates.add(line);
}
}
reader.close();
for (String word : duplicates) {
System.out.println(word);
}
}
}
Java中的Map接口不允许有重复的键值,如果要添加相同的数据,可以使用put方法进行覆盖操作。如果需要交换两个键值对的位置,可以先将其中一个键值对保存到一个临时变量中,然后再将另一个键值对放入原来的位置,最后再将保存在临时变量中的键值对放入另一个位置。示例代码如下:
Map<String, Integer> map = new HashMap<>();
map.put("key1", 1);
map.put("key2", 2);
// 交换key1和key2的位置
Integer temp = map.get("key1");
map.put("key1", map.get("key2"));
map.put("key2", temp);
不知道你这个问题是否已经解决, 如果还没有解决的话:通常开发者都是利用 Executors 提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的ExecutorService 类型或者不同的初始参数。
Executors 目前提供了 5 种不同的线程池创建配置:
(1)、newCachedThreadPool()
,它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过 60 秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用 SynchronousQueue 作为工作队列。
(2)、newFixedThreadPool(int nThreads)
,重用指定数目(nThreads)的线程,其背后使用的是无界的工作队列,任何时候最多有 nThreads 个工作线程是活动的。这意味着,如果任务数量超过了活动队列数目,将在工作队列中等待空闲线程出现;如果有工作线程退出,将会有新的工作线程被创建,以补足指定的数目 nThreads。
(3)、newSingleThreadExecutor()
,它的特点在于工作线程数目被限制为 1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目。
(4)、newSingleThreadScheduledExecutor()
和newScheduledThreadPool(int corePoolSize)
,创建的是个 ScheduledExecutorService
,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程。
(5)、newWorkStealingPool(int parallelism)
,这是一个经常被人忽略的线程池,Java 8 才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序。
TIP:另外,线程池这个定义就是个容易让人误解的术语,因为 ExecutorService 除了通常意义上“池”的功能,还提供了更全面的线程管理、任务提交等方法。
我可以给出相应的解决方案。
在Java中,交换相同键值下数据的方法是先获取该键对应的值,然后交换这两个值的位置,再将两个新的值重新放回原来的键值下。参考代码如下:
//假设map为原有的字典数据结构,key和value分别为键和值,需要交换的两个值为value1和value2 //获取key对应的值 Object temp = map.get(key); //交换两个值的位置 map.put(key, value2); map.put(key, value1); //将两个新的值重新放回原有的键值下 map.put(key, temp);
需要注意的是,如果原有的字典数据结构是不可修改的,那么需要先将其转换成可修改的结构,例如使用HashMap代替原来的Map。如果键和值的类型不是基本数据类型,则需要进行类型转换,以确保程序能正常运行。