我试着写一个小函数,它接受两个列表,并根据另一个列表的元素对一个进行排序。所以类似于:
List<Integer> keys = Arrays.asList(3, 5, 2, 4, 1);
List<String> valuesToSort = Arrays.asList("A", "B", "C", "D", "E");
List<String> sortedValues = sort(keys, valuesToSort);
将产生一个排序列表[E、C、a、D、B]
。
然而,valuesToSort
可能是一个不同的列表,比如整数、浮点数或其他列表。理想情况下,我希望我的程序能够获取我抛出的任何列表,根据键对其进行排序,然后返回与输入类型相同的列表。我该怎么做?如果
值的类型是固定的,那么排序本身就很简单,例如
public List<String> sort(List<Integer> keys, List<String> values){
Multimap<Integer, String>> multiMap = LinkedListMultimap.create();
for (int i = 0; i < keys.size(); i++) {
multiMap.put(keys.get(i), values.get(i));
}
List<String>> sortedValues = Lists.newArrayList();
for (Integer key : Ordering.natural().sortedCopy(multiMap.keys())) {
for (String value : multiMap.get(key)) {
sortedValues.add(value);
}
}
return sortedValues;
}
但这只适用于
值
是预期类型的列表的情况。
匿名用户
这里有一个方法。我推测这些键可能有重复的数字,比如[3,5,2,2,1]
。否则,更简单的算法将占上风。
- 将值从
0排序到键。size()
使用键
列表
- 对于引用的示例,这将导致以下整数流<代码>[4 2 0 3 1]
- 然后使用这些索引到值列表中
- 这将产生所需的订单
List<Integer> keys = Arrays.asList(3, 5, 2, 4, 1);
List<String> valuesToSort =
Arrays.asList("A", "B", "C", "D", "E");
List<String> result = sort(keys, valuesToSort);
System.out.println(result);
指纹
[E, C, A, D, B]
通用方法
- 使其静止
- 值列表只是索引,因此可以是任何类型的
T
- 键列表必须是
整数
类型
public static <T> List<T> sort(List<Integer> keys, List<T> values){
return IntStream.range(0, keys.size()).boxed()
.sorted(Comparator.comparing(keys::get))
.map(values::get).toList();
}
您可以按如下方式使用泛型:
public List<T> sort(List<Integer> keys, List<T> values){
Multimap<Integer, T>> multiMap = LinkedListMultimap.create();
for (int i = 0; i < keys.size(); i++) {
multiMap.put(keys.get(i), values.get(i));
}
List<T> sortedValues = Lists.newArrayList();
for (Integer key : Ordering.natural().sortedCopy(multiMap.keys())) {
for (T value : multiMap.get(key)) {
sortedValues.add(value);
}
}
return sortedValues;
}
现在,当您传递字符串列表时,通用的T
将被视为String
。当您传递整数列表时,T
将变成Integer
。这将在运行时发生。
我有一个这样的方法,它通常用于返回。 在最后一行,我从Pylance那里得到了以下信息: (方法)is_file:()- 有没有一种方法可以正确地键入提示这种情况,以便Pylance知道是?或者我应该让它总是返回路径,并有另一个方法调用将输出转换为字符串,然后返回? 谢谢 编辑1 我刚刚意识到另一个更常见的场景: 在熊猫中,输入参数可以改变输出类型,Pylance也不能处理这个问题。Pylance
问题内容: 我有一个模块分开的应用程序。有几个实体和CSV模块。CSV模块仅支持struct(Entity),但我想使CSV模块可与任何类型的实体一起使用。现在,它的工作方式如下:Csv模块从通道接收数据并将其严格转换为struct。我如何实现动态返回类型,因此它可以与任何类型的Entity一起使用,而不仅限于 问题答案: 快速/肮脏的解决方案: 返回接口{},但是您最终欺骗了编译器,而类型检查的
这个问题与这个问题很接近,但有一个主要区别。 可能的要求: (1) 我想生成一个带有通用返回值的Java函数。 (2)输入参数列表总是相同的。( (3) 函数应知道预期的返回参数类型。 我的尝试: 因为没有生成的实例,所以它不起作用。尝试使用
假设我已经包装了我的C类和,并且可以通过SWIG生成的模块从Python访问它们: 在Python中,我创建了面向用户的类,它是一个浅层代理,主要添加docstring,并允许IDE对参数名称进行制表符补全: 问题在于,返回类型为,它没有docstring,也不显示参数名称(swig将所有参数公开为)。相反,我希望它提供我自己的浅代理
我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。
下面的代码来自一个名为ButterKnife的Android库。我正在弄清楚它是怎么工作的。 我试图重新创建此函数的行为: 和用法: 但是异常并非永远不会被捕获,而是在调用方法时在行中抛出。为什么? 还有,这到底是如何工作的?该方法如何知道要转换到什么?