一些觉得不错的题目

本文介绍如何使用Java BigDecimal类精确计算给定double数组的平均值,通过String.valueOf将double转换为字符串以便于BigDecimal处理,提供了一个示例代码并强调了转换的重要性。

编程题【BigDecimal类】

求以下double数组的平均值(四舍五入保留两位小数):

double[ ] arr = {0.1,0.2,2.1,3.2,5.56,7.21};

一开始我的做法是用 double sum来求和,这样显然是不精确的,下面举了个例子

例子:

 

正确答案 附上代码:
package com.itheima.demo3;

import java.math.BigDecimal;

public class Demo01 {
    public static void main(String[] args) {
        double[] arr = {0.1, 0.2, 2.1, 3.2, 5.56, 7.21};
        BigDecimal sum = new BigDecimal("0.0");//用string类型的0.0来初始化sum

        for (int i = 0; i < arr.length; i++) {
            //String.valueOf(double d):将 double变量 d 转换成字符串
            //因为BigDecimal的接收参数为字符串类型
            String str = String.valueOf(arr[i]);
           /* BigDecimal bd1 = new BigDecimal(String.valueOf(arr[0]));
            sum.add(bd1);*/
            sum = sum.add(new BigDecimal(String.valueOf(arr[i])));
        }
        BigDecimal bd2=new BigDecimal(String.valueOf(arr.length));
        System.out.println(sum.divide(bd2, 2, BigDecimal.ROUND_HALF_UP));
    }
}

这道题的String.valueOf 起到了很大的作用,就是将double变量转成字符串,只有这样才能在BigDecimal中精确的运用,当然还有BigDecimal初始化、遍历求和中的一些语法小细节。

<think>好的,我现在需要帮助用户完成一个关于酒店评价数据分析的Python代码。用户的需是基于jieba库处理GBK编码的comment.csv文件,实现总评统计、平均评论长度计算以及好评和差评的词频分析,并按照指定格式输出。首先,我得回顾用户之前的提问和我的回答。用户之前提到需要处理GBK编码的文件,每行数据包括评论属性和内容,其中属性是0或1。现在用户需要完整的代码,包括读取文件、分词、统计总评、平均长度和词频分析,同时要符合特定的输出格式。接下来,我需要考虑如何正确读取GBK编码的CSV文件。用户提供的示例代码中使用的是用逗号分隔,但实际数据可能存在其他情况,比如评论内容中包含逗号,所以需要用maxsplit=1来分割,确保只分割第一个逗号。之前的引用[1]中的代码使用了列表推导式来提取属性,这可能对处理数据有帮助。然后是总评统计部分。总评论数就是列表ls的长度,好评和差评分别统计属性中的'1'和'0'的数量。这部分应该比较简单,直接使用len和count方法即可。平均评论长度的计算需要将所有评论内容的长度相加,然后除以评论总数,四舍五入成整数。这里需要注意的是,评论内容可能包含标点符号和数字,但用户明确说明不需要排除,所以直接计算字符长度即可。 接下来是好评和差评的词频分析。这部分需要用到jieba的lcut函数进行分词。然后需要过滤掉不符合条件的词语:长度小于2、由数字组成、或者在排除词列表中的词。排除词列表用户已经给出,需要仔细检查是否正确包含所有排除词。对于词频统计,可以使用collections模块的Counter来统计词频,然后取出现次数最多的前15个词。需要注意的是,在过滤过程中,要确保每个词都满足长度>=2,不是纯数字,并且不在排除列表中。此外,输出格式需要严格按照示例,比如“总评论:8888”这样的格式,好评和差评的词频输出每行是“词语:次数”。同时,当输入不符合要时输出“无数据”。可能需要处理的一些细节问题包括:文件读取时跳过标题行(第一行),处理可能的空行或格式错误的行,确保分词后的词语正确过滤,以及词频统计后的排序和截取前15个。另外,用户提到需要屏蔽jieba的日志信息,所以在代码开头需要设置日志级别为INFO,避免输出不必要的调试信息。现在,整合这些步骤,编写代码的结构大致如下:1.导入必要的库:jieba、logging、collections.Counter。2.设置jieba的日志级别。 3.读取文件,处理成列表,每个元素是[属性,评论内容]。 4.根据输入参数n执行不同的功能。5.对于总评,输出总数、好评、差评。 6.对于平均,计算平均长度并四舍五入。 7.对于好评或差评,过滤相应的评论,分词后进行词频统计,并按条件过滤词语,输出前15个。8.其他输入则输出“无数据”。需要测试各个功能是否正确,尤其是分词和过滤条件是否符合要。例如,检查是否排除了长度为1的词,是否排除了纯数字的词,是否排除了排除列表中的词。可能的错误点包括文件读取时的编码问题,分词后的过滤条件是否正确应用,以及词频统计时的排序是否正确。需要确保在代码中正确处理这些情况。最后,根据用户的示例输出,确保输出格式完全匹配,包括冒号后的空格和词语的顺序。</think>根据需,以下是完整的Python代码实现,包含文件读取、分词处理、统计分析和格式输出功能: ```python import jieba import logging from collections import Counter # 配置jieba日志级别 jieba.setLogLevel(logging.INFO) # 排除词列表 ex = {'不错','比较','可以','感觉','没有','我们','就是','还是','非常','但是', '不过','有点','一个','一般','下次','携程','不是','晚上','而且','他们', '什么','不好','时候','知道','这样','这个','还有','总体','位置','客人', '因为','如果','这里','很多','选择','居然','不能','实在','不会','这家', '结果','发现','竟然','已经','自己','问题','不要','地方','只有','第二天', '酒店','房间','虽然'} def process_data(): """读取并处理数据""" with open('comment.csv', 'r', encoding='GBK') as f: return [line.strip().split(',', maxsplit=1) for line in f.readlines()[1:]] def is_valid(word): """验证词语有效性""" return (len(word) >= 2 and not word.isdigit() and word not in ex) def word_frequency(comments): """词频统计函数""" words = [] for comment in comments: words.extend([w for w in jieba.lcut(comment[1]) if is_valid(w)]) return Counter(words).most_common(15) def main(n): ls = process_data() if n == '总评': print(f"总评论: {len(ls)}") print(f"好评: {sum(1 for x in ls if x[0] == '1')}") print(f"差评: {sum(1 for x in ls if x[0] == '0')}") elif n == '平均': total = sum(len(x[1]) for x in ls) print(round(total/len(ls))) elif n in ['好评', '差评']: target = '1' if n == '好评' else '0' filtered = [x for x in ls if x[0] == target] for word, count in word_frequency(filtered): print(f"{word}: {count}") else: print("无数据") # 测试示例 if __name__ == "__main__": n = input().strip() main(n) ``` **代码说明:** 1. **数据读取** 使用`process_data`函数读取GBK编码文件,跳过标题行,将每行分割为`[属性, 内容]`组成的列表[^1]。利用`maxsplit=1`确保即使评论内容包含逗号也能正确分割。 2. **总评统计** 当输入"总评"时,通过列表推导式统计: $$总评论数 = |ls|$$ $$好评数 = \sum_{x \in ls} \delta(x_0, '1')$$ $$差评数 = \sum_{x \in ls} \delta(x_0, '0')$$ 其中$\delta$为指示函数[^1] 3. **平均长度计算** 计算所有评论内容的字符总数: $$平均长度 = \frac{\sum_{x \in ls} |x_1|}{|ls|}$$ 结果四舍五入为整数[^3] 4. **词频分析** - 使用`jieba.lcut`进行精确模式分词 - 通过`is_valid`函数过滤无效词: $$有效词 \Leftrightarrow (|w| \geq 2) \land (\neg \text{纯数字}) \land (w \notin ex)$$ - 使用`Counter`统计词频并取前15高频词[^4] 5. **格式输出** 严格遵循示例格式要,冒号后保留一个空格,词频按降序排列 **示例测试:** ```python # 输入"总评"时输出 总评论: 8888 好评: 6666 差评: 2222 # 输入"好评"时输出前15词频 好像: 1000 也许: 901 早餐: 817 ... ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值