问题描述
我正在尝试解决以下问题:
这是我提出的解决方案
function allTrue(values) {
if ( values[0] === false) return false
if (values.length === 0) return true
let result = values.reduce( (final,value) => final = value === true,true)
return result ? true : false
}
我的问题是,是否可以将外部条件转移到reduce方法的主体中。
换句话说,如果要求我使用单一的reduce方法来解决它,我可以实现它吗?
我尝试在reduce中操纵 final ,但是稍后在下一次迭代中会对其进行修改
例如,以下测试应返回 false 但返回true
allTrue([false,true])
任何解释将不胜感激,谢谢
解决方法
您的代码不起作用的原因是,reduce
仅返回数组中的 last 元素与true
的比较结果。由于[false,true]
中的最后一个元素是true
,因此它返回true
。
请注意,您的代码过于复杂,您已经将条件有效地包含在reduce
中(赋予true
的初始值意味着零长度数组将返回true
)。您的一个问题是reduce
中的代码不正确,您应该检查并同时检查 all 先前的值是否为true
以及当前值是否为const allTrue = (values) => values.reduce((curr,value) => curr && value,true);
console.log(allTrue([]));
console.log(allTrue([true]));
console.log(allTrue([false]));
console.log(allTrue([true,true,true]));
console.log(allTrue([false,true]));
当前值以及所有先前值中的和:
package com.example.davincidrawingapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;
import com.example.davincidrawingapp.view.PikassoView;
public class MainActivity extends AppCompatActivity {
private PikassoView pikassoView;
private AlertDialog.Builder currentAlertDialog;
private ImageView widthImageView;
private AlertDialog dialogLineWidth;
private AlertDialog colorDialog;
private SeekBar alphaSeekbar1;
private SeekBar redSeekBar;
private SeekBar blueSeekBar;
private SeekBar greenSeekBar;
private View colorView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pikassoView = findViewById(R.id.view);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId())
{
case R.id.clearId:
pikassoView.clear();
break;
case R.id.saveid:
break;
case R.id.colorid:
showColorDialog();
break;
case R.id.lineWidth:
showLineWidthDialog();
break;
case R.id.eraseid:
break;
}
if (item.getItemId() == R.id.clearId) {
pikassoView.clear();
}
return super.onOptionsItemSelected(item);
}
void showColorDialog()
{
currentAlertDialog = new AlertDialog.Builder(this);
View view = getLayoutInflater().inflate(R.layout.color_dialog,null);
alphaSeekbar1 = view.findViewById(R.id.alphaSeekbar1);
redSeekBar= view.findViewById(R.id.redSeekbar);
blueSeekBar= view.findViewById(R.id.blueSeekbar);
greenSeekBar= view.findViewById(R.id.greenSeekbar);
colorView = view.findViewById(R.id.colorView);
//register Seekbar event listeners
alphaSeekbar1.setOnSeekBarChangeListener(colorSeekBarChanged);
redSeekBar.setOnSeekBarChangeListener(colorSeekBarChanged);
blueSeekBar.setOnSeekBarChangeListener(colorSeekBarChanged);
greenSeekBar.setOnSeekBarChangeListener(colorSeekBarChanged);
int color = pikassoView.getDrawingColor();
alphaSeekbar1.setProgress(Color.alpha(color));
redSeekBar.setProgress(Color.red(color));
greenSeekBar.setProgress(Color.green(color));
blueSeekBar.setProgress(Color.blue(color));
Button setColorButton = view.findViewById(R.id.setColorButton);
setColorButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pikassoView.setDrawingColor(Color.argb(
alphaSeekbar1.getProgress(),redSeekBar.getProgress(),greenSeekBar.getProgress(),blueSeekBar.getProgress()
));
colorDialog.dismiss();
}
});
currentAlertDialog.setView(view);
currentAlertDialog.setTitle("Choose Color");
colorDialog = currentAlertDialog.create();
colorDialog.show();
}
private SeekBar.OnSeekBarChangeListener colorSeekBarChanged = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser) {
pikassoView.setBackgroundColor(Color.argb(
alphaSeekbar1.getProgress(),blueSeekBar.getProgress()
));
//display the current color
colorView.setBackgroundColor(Color.argb(
alphaSeekbar1.getProgress(),blueSeekBar.getProgress()
));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
private SeekBar.OnSeekBarChangeListener widthSeekBarChange = new SeekBar.OnSeekBarChangeListener() {
Bitmap bitmap = Bitmap.createBitmap(400,100,Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
@Override
public void onProgressChanged(SeekBar seekBar,boolean fromUser) {
Paint p = new Paint();
p.setColor(pikassoView.getDrawingColor());
p.setStrokeCap(Paint.Cap.ROUND);
p.setStrokeWidth(progress);
bitmap.eraseColor(Color.WHITE);
canvas.drawLine(30,50,370,p);
widthImageView.setImageBitmap(bitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
void showLineWidthDialog()
{
currentAlertDialog = new AlertDialog.Builder(this);
View view = getLayoutInflater().inflate(R.layout.width_dialog,null);
final SeekBar widthSeekbar = view.findViewById(R.id.widthseekBar);
Button setLineWidthButton = view.findViewById(R.id.widthDialogButton);
widthImageView = view.findViewById(R.id.imageViewid);
setLineWidthButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
pikassoView.setLineWidth(widthSeekbar.getProgress());
dialogLineWidth.dismiss();
currentAlertDialog = null;
}
}
);
widthSeekbar.setOnSeekBarChangeListener(widthSeekBarChange);
currentAlertDialog.setView(view);
dialogLineWidth = currentAlertDialog.create();
dialogLineWidth.setTitle("Set Line Width");
dialogLineWidth.show();
}
}
,
我认为这会有所帮助:
function allTrue(values) {
return values.reduce((final,value) => final && value)
}
,
我们也可以使用every
来找到解决方案。以下是every
和reduce
var allTrue_Every = (arr) => arr.every(d => d == true)
console.log(allTrue_Every([true,true]))
console.log(allTrue_Every([true,false]))
var allTrue_Reduce = (arr) => arr.reduce((r,d) => r && d,true)
console.log(allTrue_Reduce([true,true]))
console.log(allTrue_Reduce([true,false]))