提问人:Aindriu 提问时间:6/24/2023 最后编辑:Aindriu 更新时间:6/24/2023 访问量:54
比较用于 csv 数据插入的字符串数组标头
Comparing String array headers for csv data insertion
问:
嗨,我正在尝试编写一个包含一些数据的 csv 文件,我想将 EMPTY_Columns 数组中的元素与MY_HEADERS数组进行比较,如果它们相同,我想写在空字符串中,如果它们不同,我想写一些数据。
我制作了一个布尔函数来检查标题是否相同,以便我可以将空字符串写入这些列并移动到下一行
private boolean sameHeaders(String[] A, String[] b) {
for(int i = 0; i <= a.length - 1; i++) {
if(a[i].equals(b[i]))
return true;
}
return false
}
我将此函数称为另一个函数,用于将 csv 数据写入 csv
private void writeCsvData(File csv, List<MyReport> reports) {
try (Buffered write = new BufferedWriter(new FilterWrite(csv))) {
write.write(getReportHeader());
writer.newLine();
for(MyReport report : reports) {
if(!sameHeaders(MY_HEADERS, EMPTY_COLUMNS)) {
writer.write(getReportData(report));
writer.newLine();
} else {
writer.write("")
writer.newLine();
}
}
writer.flush();
} catch (exception e) {
//errors and exception logging
}
我以为这样的东西会起作用,但现在它只是将空字符串写入 csv 有人知道我哪里出错了吗?
答:
我写了一个基本的 JUnit-Test,它可以帮助澄清你要做什么。首先,我将您的代码放在一个名为以下内容的类中:HeaderComparator.java
public class HeaderComparator {
public boolean sameHeaders(String[] a, String[] b) {
for(int i = 0; i <= a.length - 1; i++) {
if(a[i].equals(b[i]))
return true;
}
return false;
}
}
这基本上与您提供的方法相同。之后,我编写了一个 JUnit-Test 来比较 2 个标头,分别称为 和 ,以测试您的期望:MY_HEADERS
EMPTY_COLUMNS
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Unit test for simple App.
*/
public class HeaderComparatorTest {
@Test
public void testSameHeaders() {
String[] MY_HEADERS = new String[] { "Header1", "Header2", "Header3"};
String[] EMPTY_COLUMNS = new String[] { "Header1", "Header2", "Header3"};
assertTrue(new HeaderComparator().sameHeaders(MY_HEADERS, EMPTY_COLUMNS));
}
@Test
public void testDifferentHeaders1() {
String[] MY_HEADERS = new String[] { "Header1", "Header2", "Header3"};
String[] EMPTY_COLUMNS = new String[] { "", "Header2", "Header3"};
assertFalse(new HeaderComparator().sameHeaders(MY_HEADERS, EMPTY_COLUMNS));
}
@Test
public void testDifferentHeaders2() {
String[] MY_HEADERS = new String[] { "Header1", "Header2", "Header3"};
String[] EMPTY_COLUMNS = new String[] { "Header5", "Header2", "Header3"};
assertFalse(new HeaderComparator().sameHeaders(MY_HEADERS, EMPTY_COLUMNS));
}
}
第一个测试通过,根据您的期望是正确的(标头相同)。但是,第二个和第三个测试都失败了,这当然是不正确的,因为标头不同,并且您希望函数返回,而标头不相同。所以我想,你的函数的问题在于,只要同一索引下的两个元素(例如 在我提供的第二个和第三个测试中)是相同的。这可能不是你想要的。你希望它们都是一样的,对吧?false
true
a[1] = "Header2"
b[1] = "Header2"
所以也许你想要这样的东西:
public class HeaderComparator {
public boolean sameHeaders(String[] a, String[] b) {
boolean result = true;
for(int i = 0; i <= a.length - 1; i++) {
result &= a[i].equals(b[i]);
}
return result;
}
}
That makes all Unit-Tests pass. However, your function would require the two arrays to contain the columns in the exact same order.
评论