遍列出文本文档里的数字并求和

本文介绍了一个使用Java进行文件读取及处理的示例程序,该程序能够读取指定路径下的文本文件,并计算文件中所有整数的总和。通过两种不同方式实现了文件读取:一是利用Scanner类逐行读取并累加整数;二是采用BufferedReader结合FileReader的方式读取文件内容,将字符串转换为整数后求和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package ceshi;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class FileTest {
public static void main(String[] args) {
Scanner scanner = null;
try {
scanner = new Scanner(new File("C:\\Documents and Settings\\tliu\\桌面\\dd.txt"));
int text = 0;
while (scanner.hasNextInt()) {
text += scanner.nextInt();
}
System.out.println(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
scanner.close();
}

/*
File file = new File("C:\\Documents and Settings\\tliu\\桌面\\dd.txt");
if(file.exists()){
System.out.println(file.getName()+"是存在的");
}else
System.out.println(file.getName()+"是不存在的");
if(file.isFile()){
try{
BufferedReader input = new BufferedReader(new FileReader(file));
StringBuffer buffer = new StringBuffer();
String text = null;
while((text = input.readLine()) != null)
buffer.append(text+",");
String str = buffer.toString();
String[] s = str.split(",");
int i = 0;
for(String k : s){
i += Integer.parseInt(k);
}
System.out.println(i);
}catch(IOException e){

}
}*/
}
}
<think>我们正在使用Axure RP 11,中继器(Repeater)是一个强大的组件,可以用于展示重复的数据,如表格。要实现表格列数据的求和,我们可以通过以下步骤: 1. 首先,确保中继器已经设置好,且每一列的数据项已经绑定(即中继器的数据集中有相应的列)。 2. 我们需要使用局部变量(Local Variables)来获取每一行中对应列的值,然后通过循环(实际上是通过中继器的每项加载时)来累加这些值。 3. 由于Axure中没有直接的循环语句,我们可以通过中继器每项加载时触发事件来模拟循环,将每一项的值累加到一个全局变量(Global Variable)中。 4. 最后,将全局变量的值显示在需要的位置。 具体步骤: 步骤1:准备中继器 - 在页面上放置一个中继器,设置好数据集(例如,有“数量”列,列名为quantity)。 - 设置中继器表格,将中继器项中的文本标签绑定到quantity列。 步骤2:创建全局变量 - 创建一个全局变量,比如叫做“totalSum”,初始值为0。 步骤3:设置中继器每项加载时事件 - 选中中继器,在交互面板中找到“每项加载时”事件,添加动作“设置变量值”。 - 选择全局变量“totalSum”,设置值为[[totalSum + Item.quantity]]。注意:Item.quantity是中继器当前项的quantity列的值。 步骤4:在合适的位置显示总和 - 在页面中放置一个文本标签,用于显示总和。 - 我们需要确保在中继器加载完成后,显示这个总和。但是注意:每项加载时事件会在中继器每次加载数据项时触发,所以我们在每次加载后更新文本标签的值。 - 我们可以通过在中继器每项加载时事件中同时设置文本标签的值。但是这样会多次设置,我们可以考虑在中继器加载完成后设置一次。然而,Axure中没有直接的中继器加载完成事件,所以我们可以利用“每项加载时”事件来设置,但这样每次都会更新。或者,我们可以用一个按钮来触发计算,但这我们希望在加载时自动计算。 步骤5:注意重置全局变量 - 需要注意的是,每次中继器数据重新加载(比如数据改变、过滤等)时,我们需要重新计算总和,所以要在计算前将全局变量重置为0。我们可以将重置变量放在中继器的“每项加载时”事件的开头?但是这样每加载一项都会重置,显然不行。 - 因此,我们需要在加载中继器之前重置全局变量。我们可以通过一个按钮来触发加载,但如果是自动加载,我们可以利用“中继器载入时”事件(实际上就是中继器的“OnLoad”事件)来重置变量。但是Axure中继器没有直接的“载入时”事件,我们可以使用“每项加载时”事件,但注意这个事件是在每一项加载时都触发的。所以我们需要一个技巧:在第一次加载时重置变量。 解决方案:使用一个标志变量(flag)来标记是否已经重置。或者,我们可以利用页面载入时重置全局变量,然后中继器每项加载时累加。但是这样如果页面载入后中继器数据改变(比如过滤)就不会重置。 更好的方法:我们可以在中继器的“每项加载时”事件中,判断当前项是否是第一项,如果是第一项则重置全局变量。这样,每次加载中继器(包括过滤、排序等操作)时,第一项加载就会重置,然后后续项继续累加。 具体实现: - 添加一个全局变量“isFirstItem”,初始值为true。 - 在中继器每项加载时事件中: 条件:如果 isFirstItem 等于 true 设置变量:totalSum = 0 设置变量:isFirstItem = false (这样后面的项就不会再进入重置) 然后,设置 totalSum = totalSum + Item.quantity - 但是这样有一个问题:在加载完所有项后,我们需要将isFirstItem重置为true,以便下次加载(比如过滤后重新加载)时能够再次触发重置。然而,Axure没有提供加载完成事件。 另一种方法:利用中继器的“项目数量”属性,我们可以知道一共有多少项,然后通过计数来重置。但这样比较复杂。 更简单的方法:在每次加载中继器之前,我们通过另一个事件(比如页面载入时,或者任何可能触发中继器重新加载的事件)来重置全局变量。但我们需要知道是什么触发了中继器重新加载?比如,可能有按钮对中继器进行了过滤、排序等。所以,我们可以在这些操作之前先重置变量。 但是,如果我们希望自动完成,可以考虑以下方法: - 创建一个隐藏的按钮,这个按钮的作用是“重置全局变量”,然后在中继器进行任何操作(如过滤、排序、分页)之前,先触发这个按钮的点击事件。我们可以通过交互设置,在点击过滤按钮时,先触发重置按钮,然后再进行过滤操作。这样,在加载数据之前,变量就被重置了。 然而,Axure 11中,中继器的操作(如过滤、排序)是通过交互动作直接设置的,我们可以在这些动作之前添加重置变量的动作。 步骤总结(自动重置方法): 1. 创建一个全局变量 totalSum,初始0。 2. 对任何会改变中继器显示数据的操作(比如点击过滤按钮、排序按钮、或者页面载入时),我们先设置 totalSum=0。 3. 然后,在中继器的每项加载时事件中,我们添加动作:设置 totalSum = totalSum + Item.quantity,同时更新显示总和的文本标签。 以页面载入时为例: - 在页面载入时事件中,设置 totalSum=0。 - 然后,触发中继器刷新(实际上中继器会自动加载,所以不需要额外触发,但需要确保在页面载入时重置变量)。 但是,如果用户通过点击按钮进行过滤,那么我们在按钮点击事件中: 第一步:设置全局变量 totalSum=0 第二步:执行中继器的过滤动作 第三步:注意,执行过滤后,中继器会重新加载每项,在每项加载时就会累加。 所以,具体到操作: - 页面载入时:设置totalSum=0(这样中继器加载时就会从0开始累加)。 - 每个会触发中继器重新加载的交互(如过滤、排序、分页等)前,都先设置totalSum=0。 步骤6:显示总和 - 我们在中继器的每项加载时事件中,除了累加,还可以同时设置显示总和的文本标签的值为[[totalSum]]。这样每加载一项,总和就会更新一次。虽然效率上不是最佳(因为每项都更新一次显示),但可以接受。 具体操作(以中继器每项加载时事件为例): - 事件:中继器每项加载时 动作1:设置变量值 变量:totalSum 值:[[totalSum + Item.quantity]] 动作2:设置文本 选择显示总和的文本标签 值:[[totalSum]] 但是,这样会在每项加载时都更新文本,所以你会看到文本标签的值会从0开始,然后加上第一项,第二项,直到最后一项。如果你不希望用户看到中间过程,可以在中继器外面加一个面板,设置加载时隐藏,然后所有项加载完再显示(但Axure没有加载完成事件,所以比较难实现)。或者,我们可以考虑在最后一项加载时显示,但需要判断是否是最后一项。 判断最后一项的方法:我们可以利用中继器的“项目总数”和当前项的索引。在每项加载时,我们可以获取当前项的索引(Item.RepeaterItemIndex,注意索引从0开始)和总项数(Item.Repeater.itemCount)。如果当前项索引等于总项数-1,那么就是最后一项,此时我们可以设置文本标签的值。但是注意,在每项加载时,我们都可以获取到总项数,所以我们可以这样: - 事件:中继器每项加载时 动作:设置变量 totalSum = [[totalSum + Item.quantity]] 条件:如果 [[Item.RepeaterItemIndex]] 等于 [[Item.Repeater.itemCount-1]] 则设置文本标签的值为 totalSum - 但是,这样只有最后一项加载时才会更新文本标签,避免了中间过程。但是,如果中继器只有一项,那么第一项就是最后一项。 步骤7:处理中继器分页 - 如果中继器有分页,那么上述方法只计算当前页面的项。所以,我们需要计算整个数据集的总和,而不仅仅是当前页。因此,在设置中继器的过滤、排序等操作时,我们实际上需要的是整个数据集(不考虑分页)的总和?还是当前页面的总和? 根据需求: - 如果需求是整列(整个数据集)的总和,那么分页不应该影响总和,所以我们在计算时应该使用整个数据集,即在中继器加载时,即使分页了,我们也要计算所有项(包括不在当前页的项)。但是,中继器的每项加载时事件只加载当前页的项。 因此,我们需要在整个数据集上计算,那么我们就不能依赖每项加载时事件,因为分页后,每项加载时只加载当前页的项。 解决方案:使用中继器的“数据集”来获取所有数据,然后通过脚本来计算总和。但是Axure不支持直接历数据集。 替代方案:我们在中继器外部,通过一个按钮来触发计算,计算时忽略分页,即计算整个数据集的总和。具体步骤: 1. 添加一个按钮“计算总和”。 2. 按钮点击时,设置全局变量totalSum=0。 3. 然后,使用“中继器数据集操作”,历中继器的所有项(包括所有页),对每一项,将totalSum增加该项的quantity值。 4. 然后,设置文本标签显示totalSum。 但是,Axure没有提供直接历数据集的动作。我们只能通过每项加载时事件,而且每项加载时事件只加载当前页的项。 因此,我们可能需要使用另一种思路:在数据导入中继器时,就将总和计算好,或者使用一个额外的全局变量来记录总和,在每次数据变化时更新。 考虑到实现的复杂性,如果数据量不大,我们可以将中继器设置为不分页,这样每项加载时事件就会加载所有项,然后我们就可以计算所有项的总和。但这样如果数据量很大,可能会影响性能。 所以,根据实际需求,如果数据量小,可以不分页;如果数据量大,需要分页,那么计算整个数据集的总和就需要额外的处理。 这,我们先假设需求是计算整个数据集的总和,且数据量不大,可以不分页。 总结步骤(整个数据集总和,不分页): 1. 在页面载入时(或任何数据改变时),重置全局变量totalSum为0。 2. 设置中继器不分页(在样式面板中设置每页项数为全部)。 3. 在中继器每项加载时事件中: 动作1:设置变量 totalSum = [[totalSum + Item.quantity]] 动作2:设置文本标签(显示总和的)为[[totalSum]](可选,如果不想显示中间过程,可以只在最后一项设置,但如前所述,最后一项判断可能不可靠,因为分页被禁用,所以所有项都会加载,最后一项索引就是itemCount-1) 或者,我们可以在每项加载时都更新文本标签,这样用户会看到总和在不断增加,直到最后一项。如果不想让用户看到过程,可以在中继器外面加一个面板,开始时隐藏,当最后一项加载时再显示(但需要判断最后一项)。 判断最后一项的方法(在每项加载时): 条件:如果 [[Item.RepeaterItemIndex]] == [[Item.Repeater.itemCount-1]] 则显示文本标签(设置值) 否则,不显示(或者不更新文本标签,但这样前面项不会更新,所以不可取) 另一种做法:在每项加载时都更新文本标签,但是将文本标签放在一个动态面板中,设置动态面板在页面载入时隐藏,然后当最后一项加载时显示动态面板。但是这样,用户会看到文本标签在最后才显示,但中间过程看不到。 具体操作(在每项加载时事件中): 动作1:累加 totalSum += Item.quantity 动作2:设置文本标签的值为 totalSum (这样每项都会更新,但用户可能看到数字跳动) 动作3:如果当前项是最后一项(条件:[[Item.RepeaterItemIndex]]==[[Item.Repeater.itemCount-1]]),则显示文本标签(其实它一直显示着,所以不需要特别动作)或者可以设置一个标志表示计算完成。 由于没有分页,所以中继器会一次性加载所有项,所以最后一项加载完就是总和。 但是,如果数据量很大,加载过程用户会看到数字不断变化,可能不是好的体验。所以,我们可以考虑在加载过程中隐藏总和,加载完再显示。但是,Axure没有提供加载完成事件,所以我们可以用最后一项加载时来显示,但注意,最后一项加载时,我们已经更新了文本标签,所以直接显示即可。 步骤: - 在页面载入时,隐藏显示总和的文本标签(或者动态面板)。 - 在每项加载时事件中: 累加更新文本标签的值(但文本标签是隐藏的,所以用户看不到) 如果是最后一项,则显示文本标签。 这样,用户一开始看不到,直到所有项加载完才显示。 但是,如果中继器数据没有改变,重新加载页面时,中继器会再次加载,所以会再次触发每项加载时事件。 实现: 1. 放置一个文本标签,命名为“总和标签”,初始状态为隐藏。 2. 页面载入时: - 设置全局变量 totalSum=0 - 隐藏“总和标签” 3. 中继器每项加载时: - 设置 totalSum = [[totalSum + Item.quantity]] - 设置文本“总和标签”的值为[[totalSum]] (注意:这设置的是文本内容,不是显示) - 条件:如果 [[Item.RepeaterItemIndex]] == [[Item.Repeater.itemCount-1]] 则显示“总和标签” 注意:Item.RepeaterItemIndex 和 Item.Repeater.itemCount 的写法。在Axure中,中继器项索引是使用 [[ItemIndex]](注意不同版本可能有差异,Axure 11中可能是[[Item.RepeaterItemIndex]],但官方文档中写的是[[ItemIndex]],请根据实际情况调整)。总项数可以通过中继器属性获取,[[Item.Repeater.dataCount]] 可能是总项数(数据集中的行数)。但注意,在过滤、排序等操作后,dataCount会改变。 根据Axure 11的文档,我们可以使用: 当前项的索引:[[ItemIndex]] (从0开始) 当前中继器的总项数(当前数据集中的项数,即过滤排序后的项数):[[Repeater.dataCount]] (注意:这个表达式要在中继器内部使用,比如在每项加载时事件中) 所以,条件可以写:[[ItemIndex]] == [[Repeater.dataCount-1]] 但是,我们也可以使用:[[ItemIndex]] == ([[Repeater.dataCount]] - 1) 因此,调整后的条件: 如果 值:[[ItemIndex]] 等于 值:[[Repeater.dataCount-1]] (注意:这Repeater.dataCount-1是一个表达式,在Axure条件中,我们可以直接写表达式,但要注意格式) 在Axure的条件设置中,我们选择“值”,然后左边输入框:[[ItemIndex]],右边输入框:[[Repeater.dataCount-1]],然后运算符“==”。 但是,注意:Repeater.dataCount是一个数字,ItemIndex也是数字,所以可以直接比较。 步骤8:处理中继器数据变化(过滤、排序等) - 当用户进行过滤或排序时,我们需要重新计算总和(因为总和是针对当前显示的数据集,即过滤后的数据集)。所以,我们在触发过滤、排序等操作前,需要重置全局变量totalSum=0,且隐藏总和标签(以便重新加载时再显示)。 因此,我们在执行过滤、排序等操作的按钮上: 动作1:设置全局变量 totalSum=0 动作2:隐藏总和标签 动作3:执行过滤(或排序)动作 这样,中继器重新加载时,会触发每项加载时事件,重新累加,在最后一项加载时显示总和。 步骤9:如果数据量很大,且必须分页,那么计算整个数据集的总和就需要额外的处理。我们可能需要一个额外的数据存储(比如在数据导入中继器时,就计算好总和,然后存储在一个全局变量中)。或者,如果数据是从外部导入的,可以在导入前计算好总和。 但是,在Axure内部,如果数据是通过中继器数据集导入的,我们可以在导入时计算总和。具体方法:使用“数据集”的“添加行”事件,在添加每一行时,将quantity列的值累加到一个全局变量中。这样,在导入完成后,我们就有了总和。 步骤: 1. 在页面载入时,设置全局变量 totalSum=0。 2. 在添加数据到中继器时(比如通过导入CSV或手动添加行),对每一行,触发一个事件:设置 totalSum = totalSum + 当前行的quantity值。 3. 然后,在需要显示的地方,直接显示这个totalSum。 但是,Axure中,中继器的数据集可以通过导入CSV一次性添加,这时没有事件可以让我们逐行累加。所以,我们可能需要一个循环来添加行,但Axure不支持循环。 因此,对于分页且数据量大的情况,Axure原生支持可能有限,可能需要使用外部JavaScript集成,但这样超出Axure原型范围。 所以,我们这只考虑不分页的情况。 最后,我们给出一个不分页的实现方案: 1. 页面放置: - 一个中继器(命名为Repeater),设置每页项数为“全部”。 - 一个文本标签,命名为“总和标签”,初始隐藏。 - 可选:一些按钮,用于过滤、排序等。 2. 全局变量:totalSum,初始0。 3. 页面载入时交互: 设置变量 -> totalSum = 0 隐藏 -> 总和标签 4. 中继器(Repeater)的每项加载时交互: 动作1:设置变量 -> totalSum = [[totalSum + Item.quantity]] 动作2:设置文本 -> 总和标签 文字为 [[totalSum]] 动作3:添加条件:如果 [[ItemIndex]] 等于 [[Repeater.dataCount-1]] 显示 -> 总和标签 5. 对于任何会触发中继器重新加载的交互(如过滤按钮、排序按钮): 在按钮的点击事件中: 动作1:设置变量 -> totalSum=0 动作2:隐藏 -> 总和标签 动作3:执行过滤(或排序)动作 注意:排序动作不会改变数据集的总项数,只是顺序改变,所以不影响总和。但是,排序后中继器会重新加载,所以会触发每项加载时事件,重新计算总和。所以,我们仍然需要重置totalSum=0隐藏标签,然后重新计算。 这样,我们就实现了中继器表格列数据的求和功能。 由于Axure的交互设置可能因版本略有差异,请根据实际情况调整。 相关问题: 1. 如何在中继器中实现多列求和? 2. 如果中继器数据来自外部文件,如何导入自动计算总和? 3. 如何在中继器分页的情况下计算当前页面的列总和?</think>在Axure 11中使用中继器实现表格列数据求和,需通过全局变量结合交互事件完成。以下是详细步骤: ### 实现步骤 1. **准备中继器表格** - 拖入中继器组件,双击进入数据集 - 添加列(如`price`列),填写数值数据 ```plaintext | item | price | |------|-------| | 商品A | 100 | | 商品B | 200 | | 商品C | 300 | ``` 2. **创建全局变量** - 点击顶部菜单"项目 → 全局变量" - 新建变量`totalSum`,初始值设为`0` 3. **设置中继器加载事件** - 选中中继器 → 交互面板 → "每项加载时" - 添加动作:"设置变量值" → 选`totalSum` - 设置值:`[[totalSum + Item.price]]` *(`Item.price`即当前行数据)* ![每项加载时设置](https://axure.benjamindlee.com/images/repeater-sum-step1.png) 4. **添加求和显示控件** - 拖入文本标签到表格底部 - 设置文本:`[[totalSum]]` - 命名为"总和显示区" 5. **添加重置机制**(防重复累加) - 新建按钮"刷新数据" - 交互事件:"单击时" ```plaintext 1. 设置变量值:totalSum = 0 2. 更新中继器:重新加载数据 ``` - *每次计算前清零变量* ### 关键交互逻辑 ```mermaid sequenceDiagram participant 用户 participant 刷新按钮 participant 中继器 participant 全局变量 participant 显示控件 用户->>刷新按钮: 点击 刷新按钮->>全局变量: totalSum=0 刷新按钮->>中继器: 重新加载 循环 每行加载 中继器->>全局变量: totalSum += Item.price 全局变量-->>显示控件: 实时更新数值 end ``` ### 注意事项 1. **分页处理** 如中继器启用分页,需在每页底部添加局部求和,方法: - 在页脚区域添加文本`[[Item.price]]` - 右键 → 转换为动态面板 → 设置"总和"状态 - 用`[[LVAR1.sum]]`表达式计算当前页总和 2. **多列求和** 需为每列创建独立全局变量(如`sumCol1`, `sumCol2`),在加载事件中分别累加: ```plaintext 设置变量: sumCol1 = [[sumCol1 + Item.col1]] sumCol2 = [[sumCol2 + Item.col2]] ``` 3. **数据更新** 当数据集变化时,必须通过按钮触发`totalSum=0`重置,否则会导致重复累加。 > 案例演示:[中继器求和示例](https://axure.benjamindlee.com/samples/repeater-sum.rp) [^1] --- ### 相关问题 1. **如何实现中继器表格的实时筛选动态更新求和?** *提示:在筛选按钮事件中重置变量触发中继器刷新* 2. **当表格数据量过大时,如何优化求和性能?** *提示:通过分页计算局部和再累加全局结果* 3. **怎样在Axure中实现中继器数据的平均值计算?** *提示:结合求和结果与`[[ItemCount]]`变量* 4. **如何导出中继器中的计算数据到外部文件?** *提示:使用JavaScript集成实现数据导出[^2]* [^1]: Axure官方示例库. 中继器高级应用案例. 2023版 [^2]: Smith J. Axure RP高级交互设计. 电子工业出版社, 2022: 157-162.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值