Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用数组(或列表或任何其他使用数组/列表的集合/函数)的情况下查找n个值的中值?_Java_Sorting_Pseudocode_Median - Fatal编程技术网

Java 如何在不使用数组(或列表或任何其他使用数组/列表的集合/函数)的情况下查找n个值的中值?

Java 如何在不使用数组(或列表或任何其他使用数组/列表的集合/函数)的情况下查找n个值的中值?,java,sorting,pseudocode,median,Java,Sorting,Pseudocode,Median,情景: 用户应该输入N(值的数量) 后跟N个值 如何输出中间值?您肯定需要至少N/2个位置的存储空间。这是没有办法的 在OP发布后编辑: 学习编程方面的好课程,尤其是数据结构。您不能依赖Stackoverflow完成所有的开发人员职业生涯;-)。话虽如此,让我们给你一个起点:我在这里使用ArrayList: int n = ...; // get N from the user; List<Double> list = new ArrayList<Double>(); f

情景:

用户应该输入N(值的数量) 后跟N个值


如何输出中间值?

您肯定需要至少N/2个位置的存储空间。这是没有办法的

在OP发布后编辑:

学习编程方面的好课程,尤其是数据结构。您不能依赖Stackoverflow完成所有的开发人员职业生涯;-)。话虽如此,让我们给你一个起点:我在这里使用ArrayList:

int n = ...; // get N from the user;
List<Double> list = new ArrayList<Double>();
for (int i=0; i<n; i++) {
    double element = ...; // get element from the user;
    list.add(element);
}
// Have the Java library sort the list for you
Collections.sort(list);
// now pick/compute the median from the sorted list
// I'll leave that up to you..
int n=…;//从用户处获取N;
列表=新的ArrayList();

对于(int i=0;i我建议您手工编写一个二叉树。您可能需要允许重复,但Java内置的
TreeSet
不行。也可能是您可以在网络上的某个地方找到合适的树实现。应该对树进行排序。有关更多信息,请参阅

主程序将逐个读取数字并将其插入到树中。然后,它将在树中查询中间元素,如果
N
为偶数,则查询两个中间元素

实现树不需要任何数组。为了查找第i个元素,树将执行按序遍历,计算遇到的元素并返回第i个元素


快乐编码。

数组
,无
列表
,或任何其他
集合

    try (Scanner scanner = new Scanner(System.in)) {
        System.out.print("Number of numbers: ");
        int N = scanner.nextInt();
        System.out.printf("Enter the %d numbers: ", N);
        double median = IntStream.range(0, N)
                .mapToDouble(i -> scanner.nextDouble())
                .sorted()
                .skip((N-1)/2)
                .limit(2-N%2)
                .average()
                .getAsDouble();
        System.out.printf("The median is %f%n", median);
    }

(不要注意
.sorted()
帘子后面的那个人。)

(也欢迎你尝试用伪方法来解决问题……@LeventeSzabó,只要数字是正确的sorted@LeventeSzabó这是为什么?输入没有排序,所以,如果假定的中值是n/2或[(n/2)+1]中的一个呢值?@JackFlamp不要忘记,如果有偶数个数字,那么中间值就是中间两个数字的平均值,而不使用数组?当然!使用
列表(或任何其他
集合
).是的,这与其说是一个逻辑问题,不如说是一个保存值的问题。我真的不明白。但我想解决它:)那是作弊。:-)
ArrayList
当然在幕后使用数组。当然,这是作弊。但是,如果不以这种或那种方式作弊,就没有办法解决这个问题。当然,任何已排序或可排序的集合都可以完成这项工作-ArrayList正好派上用场…我会确保忽略那个人。;-)我做了一些测试,对于有效的输入来说效果很好。非常优雅的解决方案。当您使用来自list@GilbertS它不是从列表中流出来的。该范围正用于调用
scanner.getDouble()
精确地
N次。还有其他方法可以做到这一点,例如
stream.tokens().limit(N).mapToDouble(Double::parseDouble).sorted()…
(未测试),它将在从扫描程序流中获取前N个令牌后停止。